A Model Context Protocol (MCP) server for semantic search over zoning code PDFs, designed for ChatGPT integration.
- PDF Ingestion: Upload zoning code PDFs via multipart form-data
- Semantic Search: OpenAI-powered search with file_search tool
- Structured Citations: Returns filename, section, and text snippets
- ChatGPT Compatible: SSE endpoints for connector integration
- Docker Ready: Containerized for easy deployment
- Render Deployment: One-click deployment with render.yaml
npm install
cp .env.example .env
# Add your OPENAI_API_KEY to .env
npm startdocker build -t zoning-mcp-server .
docker run -p 3030:3030 -e OPENAI_API_KEY=your_key zoning-mcp-server- In the Render dashboard select New > Blueprint Deploy and point it at this repository. Render will read
render.yamland create the Docker-based web service. - In the Render UI, set the following environment variables before the first deploy:
OPENAI_API_KEY– required; the key must have access to the Responses + File Search APIs.- (Optional)
MCP_AUTH_TOKEN– set a Bearer token if you want to keep authentication enabled. - (Optional)
ALLOW_NO_AUTH=1– keep this if you want unauthenticated access from ChatGPT. Remove it when using a custom token.
- Click Deploy. Render will build the Docker image and start the service, binding to the port supplied in the
PORTenv var (managed automatically by Render). - After it goes live, verify the deployment with
curl https://<your-render-domain>/health– it should return{ "ok": true }. - Use the public URL
https://<your-render-domain>/sseas the MCP endpoint inside ChatGPT. Supply theMCP_AUTH_TOKENyou configured if auth is enabled.
GET /health- Health checkPOST /ingest- Upload PDF filesPOST /mcp- MCP JSON-RPC endpointGET /sse- Server-Sent Events for ChatGPTPOST /sse- Alternative MCP endpoint
Use as MCP Server URL: https://your-domain.com/sse
Authentication: No authentication (ALLOW_NO_AUTH=1)
OPENAI_API_KEY- Required: Your OpenAI API keyPORT- Server port (default: 3030)HOST- Interface to bind (default: 0.0.0.0; use 127.0.0.1 for local testing if needed)ALLOW_NO_AUTH- Disable authentication (default: false)DEBUG_MCP- Enable debug logging (default: false)MCP_AUTH_TOKEN- Bearer token for auth (default: mcp-zoning-token)VECTOR_STORE_NAME- OpenAI vector store name (default: zoning-codes-store)