The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the ProjectPermit listing page.
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.
No account, API key, wallet, MCP client, or platform integration is required for the current structured-facts validation preview.
POST https://projectpermit-api-v2-production.up.railway.app/v1/preview-project-requirementsGET https://projectpermit-api-v2-production.up.railway.app/v1/capabilitieshttps://projectpermit-mcp-production.up.railway.app/mcpSee 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.
Current deterministic rule footprint:
gatineau_qcottawa_ontoronto_onmississauga_onlaval_qclongueuil_qcvancouver_bcThe 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.
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_REVIEWThe 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.
https://projectpermit-api-v2-production.up.railway.appPOST https://projectpermit-api-v2-production.up.railway.app/v1/preview-project-requirementshttps://projectpermit-mcp-production.up.railway.app/mcphttps://projectpermit-x402-mcp-production.up.railway.app/mcpThe 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:
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.
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 examplesAll 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.
For standard MCP support:
projectpermit-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:
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:
A successful preflight response also contains workflow, for example:
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.
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 templateSummarize validation evidence with:
Unknown 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.
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 designThe 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.
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-batchCanonical paid MCP resource:
https://projectpermit-x402-mcp-production.up.railway.app/mcpCommercial 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.
Current CI covers:
/healthSee STATUS.md for the broader engineering/validation state and the distribution documents above for market evidence.
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.