Planning MCP Server
Provides comprehensive Australian planning property reports, including zoning, overlays, land size, and utility information for AI assistants. This high-performance MCP server is built for Cloudflare Workers and enables real-time property data retrieval through an HTTP-based interface.
README
Planning MCP Server v2.0
Model Context Protocol (MCP) server for Australian Planning Property Reports - Cloudflare Workers Edition.
Features
- š Global Edge Deployment - Runs on Cloudflare's 300+ edge locations
- ā” High Performance - Parallel API requests and intelligent caching
- š Comprehensive Data - Property details, zones, overlays, electorates, utilities, and land information
- š Production Ready - Rate limiting, authentication, structured logging
- š Real-time Progress - Progress updates during long-running operations
- š HTTP-based MCP - Works with Claude, ChatGPT, and other AI assistants
Quick Start
Prerequisites
- Node.js 18+
- Cloudflare Workers account
- Wrangler CLI (
npm install -g wrangler)
Installation
# Clone the project
cd planning-mcp
# Install dependencies
npm install
# Login to Cloudflare
wrangler login
# Create KV namespace for caching
wrangler kv:namespace create "CACHE"
# Copy the ID and add to wrangler.toml
# Start development server
npm run dev
Configuration
- Update
wrangler.tomlwith your KV namespace ID - (Optional) Set API key for authentication:
wrangler secret put API_KEY
Deployment
# Build the project
npm run build
# Deploy to Cloudflare Workers
npm run deploy
Usage
MCP Tool: vic_planning_property_report
Retrieves comprehensive Victorian planning property reports. (Additional state tools coming soon.)
Input:
{
"address": "1 Spring Street, Melbourne VIC 3000",
"includePdfBase64": false,
"includeZoneHtml": false,
"includeOverlayHtml": false
}
Output:
{
"success": true,
"address": "1 SPRING STREET MELBOURNE VIC 3000",
"propertyPfi": "12345",
"propertyDetails": {
"address": "1 SPRING STREET MELBOURNE VIC 3000",
"councilName": "Melbourne City Council",
"landSize": 842,
"landSizeHectares": 0.0842,
"standardParcelIdentifier": "1\\PS123456",
"registeredAboriginalParty": "Bunurong Land Council",
...
},
"electorates": {
"federal": "Melbourne",
"legislativeAssembly": "Melbourne District",
"legislativeCouncil": "Southern Metropolitan Region"
},
"utilities": {
"powerDistributor": "AusNet Services",
"gas": "AusNet Services",
"melbourneWater": "Melbourne Water",
"melbourneWaterRetailer": "South East Water"
},
"zones": [...],
"overlays": [...]
}
HTTP API
Health Check:
GET /health
MCP Endpoint:
POST /mcp
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/call",
"params": {
"name": "vic_planning_property_report",
"arguments": {
"address": "1 Spring Street, Melbourne VIC 3000"
}
}
}
Architecture
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Cloudflare Edge Network ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā Worker (HTTP MCP Endpoint) ā ā
ā ā - Hono.js Framework ā ā
ā ā - Rate Limiting ā ā
ā ā - Authentication ā ā
ā ā - CORS ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā Services Layer ā ā
ā ā - Address Resolution ā ā
ā ā - Property Data Fetching ā ā
ā ā - Progress Reporting ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
ā ā Workers KV (Caching) ā ā
ā ā - 60%+ Cache Hit Rate ā ā
ā ā - 24hr TTL for addresses ā ā
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Development
Project Structure
planning-mcp/
āāā src/
ā āāā index.ts # Main entry point
ā āāā types/ # TypeScript types
ā āāā services/ # Business logic
ā āāā middleware/ # HTTP middleware
ā āāā handlers/ # MCP handlers
ā āāā lib/ # Utilities
ā āāā schemas/ # Validation schemas
āāā test/ # Tests
āāā wrangler.toml # Cloudflare config
āāā tsconfig.json # TypeScript config
āāā package.json # Dependencies
Testing
# Run tests
npm test
# Run tests with coverage
npm run test:coverage
# Type check
npm run type-check
Environment Variables
Configure in wrangler.toml:
| Variable | Description | Default |
|---|---|---|
RATE_LIMIT_PER_MINUTE |
Rate limit per IP | 100 |
CACHE_TTL_HOURS |
Cache TTL in hours | 24 |
ENABLE_ANALYTICS |
Enable analytics | true |
ALLOWED_ORIGINS |
CORS origins | * |
Secrets (use wrangler secret put):
| Secret | Description | Required |
|---|---|---|
API_KEY |
Bearer token for auth | No |
Performance
- Latency: <5s P50, <8s P95
- Cache Hit Rate: >60% after warmup
- Throughput: 1000+ req/sec with auto-scaling
- Cold Start: <100ms
- Memory: <128MB per request
Security
- ā Input validation with Zod
- ā Rate limiting (100 req/min per IP)
- ā Optional API key authentication
- ā CORS configuration
- ā No secrets in logs
Monitoring
Structured Logging
All requests are logged in JSON format with correlation IDs:
{
"timestamp": "2024-01-30T10:00:00.000Z",
"level": "info",
"message": "Tool call started",
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"tool": "vic_planning_property_report",
"metadata": {
"address": "1 Spring St"
}
}
Analytics
Enable Cloudflare Analytics Engine for:
- Request counts and latency
- Cache hit/miss rates
- Error tracking
- API performance metrics
Deployment Options
Option 1: Cloudflare Workers (Recommended)
- 300+ edge locations
- $5/month base + usage
- Lowest latency globally
Option 2: Vercel Edge Functions
See Vercel deployment guide for migration instructions.
Option 3: Oracle Server
Traditional Node.js deployment - see v1.0 branch.
Troubleshooting
Common Issues
KV Namespace not found:
# Create namespace and update wrangler.toml
wrangler kv:namespace create "CACHE"
Rate limit errors:
# Increase limit in wrangler.toml
RATE_LIMIT_PER_MINUTE = "200"
Authentication failures:
# Check API key is set
wrangler secret list
wrangler secret put API_KEY
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
License
MIT
Support
- Documentation: PRD
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Changelog
v2.0.0 (2024-01-30)
- ⨠Rewritten for Cloudflare Workers
- ⨠HTTP-based MCP protocol
- ⨠Enhanced property data with land size
- ⨠Real-time progress updates
- ⨠Parallel API requests
- ⨠Intelligent caching with Workers KV
- ⨠Complete field coverage (15+ fields)
- š Production-ready security
- š Structured logging and metrics
v1.0.0
- Initial Node.js stdio implementation
Built with ā¤ļø for Australian planning research
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.