Skip to main content
Glama
andrewjgalea

Planning MCP Server

by andrewjgalea

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

Related MCP server: Dilix MCP

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

  1. Update wrangler.toml with your KV namespace ID

  2. (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

  • 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

  1. Fork the repository

  2. Create a feature branch

  3. Make your changes

  4. Add tests

  5. Submit a pull request

License

MIT

Support

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

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    A production-ready MCP server for AI agents, providing deep web research and RAG capabilities via Cloudflare Workers.
    -
  • A
    license
    A
    quality
    D
    maintenance
    Open-source MCP server providing real estate regulatory intelligence (zoning, permits, entitlements, deal scoring) for US properties, enabling AI agents to access 10 callable tools.
    12
    9 npm
    MIT