{
  "protocol": "Open Pool Protocol",
  "version": "0.1",
  "updated": "2026-06-20",
  "summary": "Open standard for contributing free-resource & gift data to the planetary Pool. Any agent that conforms can connect a source. Maps to existing open standards so it interoperates with the wider ecosystem instead of inventing a format.",
  "standards_mapping": {
    "human_services": "HSDS / Open Referral (food banks, shelters, free services) — the primary target for high-intent categories",
    "general": "Schema.org (Place, Service, Offer, CivicStructure, Event)",
    "geo": "GeoJSON Point / OSM tags",
    "events": "iCalendar (RFC 5545) / Schema.org Event"
  },
  "categories": ["place", "service", "housing", "food", "goods", "skills", "event"],
  "resource_schema": {
    "type": "object",
    "required": ["external_id", "category", "title", "country"],
    "properties": {
      "external_id": {"type": "string", "description": "Stable id within your source; the Pool namespaces it as <source_id>:<external_id>."},
      "category": {"type": "string", "enum": ["place", "service", "housing", "food", "goods", "skills", "event"]},
      "title": {"type": "string", "maxLength": 200},
      "description": {"type": "string", "maxLength": 2000},
      "url": {"type": "string", "format": "uri"},
      "country": {"type": "string", "description": "ISO display name, e.g. 'Netherlands', 'Sweden'."},
      "city": {"type": "string"},
      "lat": {"type": "number"}, "lng": {"type": "number"},
      "value_eur": {"type": "number", "description": "Optional. Leave null; the Pool does not rank on fabricated value."},
      "available_from": {"type": "string", "format": "date-time"},
      "available_until": {"type": "string", "format": "date-time"},
      "opening_hours": {"type": "string", "description": "OSM opening_hours syntax preferred."},
      "access": {"type": "string", "enum": ["open_to_all", "referral_needed", "members", "id_required", "appointment"]},
      "accessibility": {"type": "string", "description": "e.g. 'wheelchair=yes; step_free'"},
      "languages_served": {"type": "array", "items": {"type": "string"}},
      "license": {"type": "string", "description": "REQUIRED for clean downstream use, e.g. 'ODbL', 'CC-BY-4.0', 'CC0'."},
      "freshness_tier": {"type": "string", "enum": ["daily", "weekly", "monthly", "permanent"], "description": "How often this should be re-confirmed."}
    }
  },
  "source_manifest": {
    "type": "object",
    "required": ["source_id", "name", "ingest_mode", "license", "owner_did"],
    "properties": {
      "source_id": {"type": "string"},
      "name": {"type": "string"},
      "ingest_mode": {"type": "string", "enum": ["pull", "push", "federate"]},
      "endpoint": {"type": "string", "description": "For pull/federate: where the Pool fetches."},
      "mapping": {"type": "object", "description": "Field mapping from your format to resource_schema (or 'hsds' to use the built-in HSDS adapter)."},
      "cadence": {"type": "string", "description": "For pull, e.g. 'daily', 'hourly'."},
      "license": {"type": "string"},
      "owner_did": {"type": "string", "description": "did:key of the contributing agent; all writes are signed by it."}
    }
  },
  "identity_and_signing": {
    "scheme": "did:key (Ed25519)",
    "canonicalization": "RFC 8785 JSON Canonicalization Scheme (JCS)",
    "rule": "Every register_source / contribute_resources call is signed over the JCS-canonical payload; the Pool verifies against the DID before accepting and stores the signature for re-verification."
  },
  "ingest_pipeline": [
    "schema-validate", "license-check", "geo-validate", "cross-source dedup (geo+name)",
    "trust-gate", "quarantine if low-trust (sampled before promotion)", "promote to active", "index"
  ],
  "trust_tiers": ["curated", "official", "open-data", "unverified"],
  "write_tools_planned": {
    "register_source": "declare a pull/push source (manifest, signed)",
    "contribute_resources": "bulk-submit resources conforming to resource_schema (signed)",
    "update_resources / expire_resources": "maintain freshness/liveness",
    "source_status": "health: acceptance rate, dedup rate, liveness, trust tier"
  },
  "status": "Read tools live (search_resources, get_resource, pool_overview, get_contribution_spec). Write/ingest tools land after the validated MVP wedge, behind trust tiers + moderation (see docs/mcp-server-design.md §19.7)."
}
