projectpermit-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@projectpermit-mcpCheck permit requirements for enlarging a window at 110 Laurier Ave W in Ottawa."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ProjectPermit / BuildRequirements
ProjectPermit is a building permit requirements API & MCP for contractors and AI agents. It checks proposed construction and renovation scope across 7 Canadian municipalities and returns deterministic permit signals, official-source evidence, workflow routing, and an automation-ready action bundle. BuildRequirements is the deterministic rules engine inside it.
Try free in 30 seconds
No account, API key, wallet, MCP client, or platform integration is required for the current structured-facts validation preview.
Free HTTP preview:
POST https://projectpermit-api-v2-production.up.railway.app/v1/preview-project-requirementsFree capability discovery:
GET https://projectpermit-api-v2-production.up.railway.app/v1/capabilitiesFree standard MCP preview:
https://projectpermit-mcp-production.up.railway.app/mcp
See TRY_PROJECTPERMIT.md for a copy-paste curl example and the preview privacy boundary. The anonymous HTTP preview intentionally excludes civic-address/GIS resolution; use the standard MCP developer preview for a bounded address-aware validation workflow.
Related MCP server: readypermit-mcp
Current jurisdiction coverage
Current deterministic rule footprint:
gatineau_qcottawa_ontoronto_onmississauga_onlaval_qclongueuil_qcvancouver_bc
The engine covers 8 normalized project families, preserves uncertainty instead of guessing, attaches official-source evidence to rule results, and exposes the same jurisdiction router through HTTP, standard MCP, and x402-paid MCP.
First-party municipal/open-data address resolution is available for Gatineau, Ottawa, Toronto, Mississauga and Vancouver. Laval and Longueuil currently support rule preflight with resolve_address=false.
The engine deliberately does not call an LLM. A calling agent normalizes natural-language scope into structured facts; BuildRequirements applies deterministic municipal rules.
Agent workflow differentiation
Every successful preflight now includes an additive deterministic workflow object so a contractor, property or field-service agent can use the result inside a real operating workflow instead of merely displaying a permit answer.
Stable routing signals include:
ADD_PERMIT_TASKCONTINUE_WITH_EVIDENCECOLLECT_MISSING_FACTSROUTE_SPECIAL_REVIEWMUNICIPAL_CONFIRMATIONMANUAL_SCOPE_REVIEW
The workflow package also includes a quote-handling signal, a deliberately narrow automation_safe flag, and up to three high-value follow-up questions when another deterministic call can resolve missing context. Workflow guidance never changes the underlying permit determination and never represents municipal authorization.
See docs/AGENT_WORKFLOW_GUIDANCE.md.
Live endpoints and commercial x402 pricing
HTTP API:
https://projectpermit-api-v2-production.up.railway.appFree HTTP developer-validation preview:
POST https://projectpermit-api-v2-production.up.railway.app/v1/preview-project-requirementsStandard MCP developer-validation preview:
https://projectpermit-mcp-production.up.railway.app/mcpPaid MCP:
https://projectpermit-x402-mcp-production.up.railway.app/mcp
The HTTP API exposes free machine-readable capability discovery at GET /v1/capabilities.
Commercial x402 resources are configured on Base mainnet (eip155:8453) with USDC payment. The current launch price intentionally minimizes first-use friction while paid adoption and repeat-call behavior are being validated:
single paid HTTP preflight: $0.05 USDC / call
single paid MCP preflight: $0.05 USDC / call
paid HTTP batch, up to 50 normalized projects: $2.00 USDC / batch (full 50-item batch = $0.04/item, 20% below 50 single calls)
The production facilitator is https://facilitator.payai.network.
The paid MCP exposes a free projectpermit_info tool and the x402-paid check_project_requirements tool. The paid HTTP routes return an x402 402 Payment Required challenge when no valid payment is supplied.
The result is a preflight information package, not municipal authorization, legal advice, engineering certification, or building-code design approval.
Market thesis
The business target is not a homeowner-only Do I need a permit? wizard and not a managed permit-submission service. ProjectPermit is intended to become a cross-jurisdiction permit-requirements intelligence layer embedded in contractor, property-management, construction/design, permitting, and real-estate software/Agent workflows.
Market validation remains active in parallel with product development. Differentiated product work and commercial distribution no longer wait for outreach replies. Geography expansion remains evidence-led because every additional municipality adds ongoing rule/source maintenance cost; priority goes to requested geographies or workflows with credible repeated volume.
The first commercially meaningful internal checkpoint is roughly 10,000 monthly external preflight calls. A preferred proof shape is approximately 5 integrations × 2,000 calls/month, or one platform workflow capable of the same volume. This is a validation target, not a forecast.
Read:
docs/MARKET_VALIDATION.md— market background, pricing thesis and original call-volume modeldocs/DISTRIBUTION_VALIDATION.md— 2026 platform evidence, competition and validation plandocs/CALL_VOLUME_THRESHOLDS.md— bottom-up monthly-call and revenue thresholdsdocs/PAIN_EVIDENCE.md— observed field/community pain evidence separated from assumptionsdocs/TARGET_ACCOUNT_RANKING.md— ranked design-partner targets by pain and distribution leveragedocs/OUTREACH_BATCH_01.md— tailored first outreach batchdocs/DESIGN_PARTNER_TRIAL.md— low-friction 20-case pilot protocoldocs/EXTERNAL_USAGE_BASELINE.md— clean external-usage starting baselinedocs/INTEGRATION_QUICKSTART.md— copy-paste developer integration examples
Architecture
All transports call the same shared address-aware preflight pipeline:
HTTP / standard MCP / x402 paid MCP -> preflight_service -> municipal address/GIS adapters -> jurisdiction router -> deterministic rules -> workflow guidance
Resolved non-null municipal property facts can enrich a request before rule evaluation. Unknown overlays remain unknown and never silently overwrite an explicit caller value.
Successful preflight calls also emit privacy-minimal structured usage telemetry for market validation. The telemetry excludes civic address, coordinates, property identifiers, payment credentials, IP/user-agent data and raw client tags. Internal CI/owner smoke traffic is explicitly tagged so it can be excluded from external call counts. Municipal HTTP request URL logging is suppressed so address/query details are not leaked indirectly through httpx INFO logs.
Quick start
python -m venv .venv
source .venv/bin/activate
pip install -e .
uvicorn projectpermit.api:app --host 127.0.0.1 --port 8000For standard MCP support:
pip install -e '.[mcp]'
projectpermit-mcpprojectpermit-mcp uses MCP Python SDK v2 Streamable HTTP, JSON responses, and stateless HTTP. It listens on 127.0.0.1:8001 by default. Override with PROJECTPERMIT_MCP_HOST and PROJECTPERMIT_MCP_PORT.
Run tests:
PYTHONPATH=src python -m unittest discover -s tests -vAPI
For no-wallet validation, use the free structured-facts route:
POST /v1/preview-project-requirements
For the x402-paid HTTP contract, use:
POST /v1/check-project-requirements
Both use the same normalized project shape; the anonymous free preview intentionally rejects address/GIS resolution. Example project facts:
{
"jurisdiction": "toronto_on",
"resolve_address": false,
"project": {
"family": "window_door",
"action": "replace_same_size",
"single_dwelling_house": true,
"structural_change": false,
"new_exit": false
}
}A successful preflight response also contains workflow, for example:
{
"workflow": {
"mode": "NO_PERMIT_SIGNAL",
"recommended_route": "CONTINUE_WITH_EVIDENCE",
"quote_handling": "NO_PERMIT_ALLOWANCE_SIGNAL",
"automation_safe": true,
"follow_up_questions": []
}
}For an address-aware jurisdiction, set resolve_address=true and supply address through the standard MCP preview or paid route; the anonymous HTTP preview deliberately does not accept address resolution.
Developer-validation workflow
The standard MCP endpoint remains free so a design partner can test workflow fit without a wallet or billing setup. A recommended pilot uses 20 anonymized real scopes, a stable non-PII context.client_tag, and measures whether the result actually changes the next workflow step.
Partner evidence is tracked in:
data/partner_targets.csv— 20 candidate design-partner accountsdata/partner_feedback.csv— structured conversation/pilot/call-volume outcomesdata/design_partner_scope_template.csv— anonymized pilot-case template
Summarize validation evidence with:
python scripts/summarize_partner_feedback.pyUnknown interview values remain unknown rather than being silently converted to zero. Commercial decisions therefore depend on recorded external evidence, not optimistic inference, while engineering/distribution work continues in parallel.
Repository map
src/projectpermit/engine.py— original Gatineau/Ottawa deterministic rulessrc/projectpermit/expansion_rules.py— Toronto/Mississauga rulessrc/projectpermit/quebec_expansion_rules.py— Laval/Longueuil rulessrc/projectpermit/vancouver_rules.py— Vancouver rulessrc/projectpermit/jurisdiction_router.py— public jurisdiction dispatchersrc/projectpermit/preflight_service.py— shared address-aware preflight pipelinesrc/projectpermit/workflow_advice.py— deterministic agent routing and missing-fact guidancesrc/projectpermit/address.py— Gatineau/Ottawa/Toronto address/GIS adapterssrc/projectpermit/mississauga_address.py— Mississauga address/property adaptersrc/projectpermit/vancouver_address.py— Vancouver first-party open-data adaptersrc/projectpermit/telemetry.py— privacy-minimal usage eventssrc/projectpermit/http_fetch.py— municipal HTTP fetch with request-URL log suppressionsrc/projectpermit/api.py— HTTP APIsrc/projectpermit/mcp_server.py— standard MCP v2 developer previewsrc/projectpermit/paid_mcp_server.py— x402-native paid MCP v2 serversrc/projectpermit/mcp_v2_x402_compat.py— MCP SDK v2 / x402 result compatibility shimdata/source_manifest.json— official source registry/freshness metadatadata/partner_targets.csv— first 20 design-partner targetsdata/partner_feedback.csv— structured external-validation trackerdata/design_partner_scope_template.csv— anonymized 20-case pilot templateschemas/— public request/response schemasscripts/mcp_remote_smoke.py— seven-city + Vancouver address-aware public MCP smokescripts/paid_mcp_unpaid_smoke.py— no-cost remote payment-challenge testscripts/paid_mcp_buyer_smoke.py— historical buyer-side paid smoke tooling; do not spend merely to re-prove plumbingscripts/facilitator_capability_probe.py— no-cost facilitator capability matrixscripts/projectpermit_bazaar_lookup.py— read-only Bazaar catalog lookupscripts/summarize_usage_logs.py— external/internal usage-log summarizerscripts/summarize_partner_feedback.py— partner conversation/call-volume gate summarizerdocs/AGENT_WORKFLOW_GUIDANCE.md— workflow-routing response contract and integration patterndocs/PHASE0_SPEC.md— original product/engineering scopedocs/PHASE0_RELEASE_READINESS.md— completed Phase 0 release gatedocs/MARKET_VALIDATION.md— market background and original business gatesdocs/DISTRIBUTION_VALIDATION.md— platform distribution validation plandocs/CALL_VOLUME_THRESHOLDS.md— monthly API-call economics and go/no-go thresholdsdocs/PAIN_EVIDENCE.md— observed workflow pain evidencedocs/TARGET_ACCOUNT_RANKING.md— account prioritization modeldocs/PARTNER_OUTREACH.md— outreach/discovery playbookdocs/OUTREACH_BATCH_01.md— first tailored outreach batchdocs/DESIGN_PARTNER_TRIAL.md— design-partner pilot packagedocs/EXTERNAL_USAGE_BASELINE.md— telemetry baseline before outreachdocs/INTEGRATION_QUICKSTART.md— developer quickstartdocs/X402_ARCHITECTURE.md— payment/discovery design
Production verification
The seven-city public MCP footprint and Vancouver address-aware resolution have been verified from GitHub Actions against Railway production. The Vancouver production smoke resolved the City Hall civic address 453 W 12TH AV and City zoning CD-1 (46) through Vancouver first-party open data.
Historical buyer-side paid HTTP and paid MCP settlement were verified end-to-end on testnet. The commercial production services are now configured for Base mainnet and can be verified without spending funds by checking their x402 402 Payment Required challenges. A real mainnet payment should only be made when there is a reason to verify actual settlement or a genuine buyer call.
x402 / discovery status
Canonical paid HTTP resources:
https://projectpermit-api-v2-production.up.railway.app/v1/check-project-requirementshttps://projectpermit-api-v2-production.up.railway.app/v1/check-project-requirements-batch
Canonical paid MCP resource:
https://projectpermit-x402-mcp-production.up.railway.app/mcp
Commercial network: eip155:8453 (Base mainnet)
Production facilitator: https://facilitator.payai.network
The single HTTP resource publishes Bazaar discovery metadata; paid MCP publishes MCP x402 discovery metadata. Both advertise the Agent workflow-routing differentiation.
CI / verification
Current CI covers:
Python 3.11 + 3.13
deterministic jurisdiction-rule and schema tests
workflow-guidance routing tests
address-adapter and shared-preflight regressions
telemetry privacy contract
municipal request-log privacy guard
partner-validation metric summarizer tests
official source-manifest contracts
MCP v2 integration
x402 wire behavior
MCP v2 settlement-receipt compatibility
Docker build + live
/healthpublic seven-jurisdiction MCP tool invocation
public Vancouver address-aware MCP invocation
public paid-MCP unpaid challenge
public HTTP Bazaar unpaid challenge
public paid-bulk HTTP unpaid challenge
facilitator capability checks
See STATUS.md for the broader engineering/validation state and the distribution documents above for market evidence.
Safety boundary
Determinations intentionally use preflight language such as REQUIRED, LIKELY_REQUIRED, LIKELY_NOT_REQUIRED, ADDITIONAL_REVIEW_REQUIRED, and MUNICIPAL_CONFIRMATION_REQUIRED where uncertainty exists. Ambiguous official thresholds are conservatively routed to confirmation instead of being silently resolved.
The engine should not be presented as a municipality, permit issuer, lawyer, architect, or engineer.
This server cannot be deployed
Maintenance
Related MCP Connectors
Building-permit verdicts by address, with cited records. SF, Seattle, Austin, NYC. Pay per call.
Built-environment forecasts, public benchmarks, and permit or zoning readiness through remote MCP.
Human-reviewed zoning answers with ordinance citations for covered US municipalities.
Source-linked building-permit search across 34 US states and DC, with county-level coverage.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProfessional building code compliance assistant that interfaces with municipal building codes, helping contractors and builders navigate complex regulatory requirements with precision.1MIT
- AlicenseAqualityDmaintenanceAI-powered property intelligence for instant zoning analysis, buildability assessments, ADU eligibility, flood risk, and development feasibility reports for any US address.51MIT
- AlicenseNot gradedqualityDmaintenanceEnables construction professionals to query project documents with conflict-aware RAG, detect contradictions, and trace change impacts through any MCP client.921 npmMIT
- FlicenseNot gradedqualityDmaintenanceExposes Pre-DCR and Auto-DCR building scrutiny workflows as AI-consumable tools, enabling AI assistants to open DXF drawings, validate layers, compute areas, run regulatory checks, and generate compliance reports via natural language.-