{
  "protocolVersion": "0.3.0",
  "name": "Twin Directory Agent",
  "description": "Find and talk to Twin profiles of professionals and businesses: grounded answers, availability, bookings, leads and payment requests.",
  "url": "https://twin.aiapps.fyi/api/mcp",
  "preferredTransport": "JSONRPC",
  "additionalInterfaces": [
    {
      "url": "https://twin.aiapps.fyi/api/mcp",
      "transport": "MCP-StreamableHTTP"
    },
    {
      "url": "https://twin.aiapps.fyi/api/openapi.json",
      "transport": "HTTP+JSON"
    }
  ],
  "provider": {
    "organization": "Twin",
    "url": "https://twin.aiapps.fyi"
  },
  "version": "1.0.0",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false
  },
  "securitySchemes": {
    "bearer": {
      "type": "http",
      "scheme": "bearer"
    }
  },
  "defaultInputModes": [
    "text/plain",
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "skills": [
    {
      "id": "search_profiles",
      "name": "Search profiles",
      "description": "Search the public directory of published profiles (professionals and businesses). Filter by city, category, language (ISO code, e.g. 'de').",
      "tags": [
        "visitor",
        "profile:read"
      ]
    },
    {
      "id": "get_profile",
      "name": "Get profile",
      "description": "Structured public data for one profile: services with prices and durations, hours, location, languages, links.",
      "tags": [
        "visitor",
        "profile:read"
      ]
    },
    {
      "id": "ask_profile",
      "name": "Ask a profile",
      "description": "Ask a question; returns an answer grounded ONLY in the profile's published documents, with sources and a confidence score. Low confidence means the profile does not say.",
      "tags": [
        "visitor",
        "profile:ask"
      ]
    },
    {
      "id": "check_availability",
      "name": "Check availability",
      "description": "List open booking slots (ISO start/end + local label) for a service in a date range (max 14 days).",
      "tags": [
        "visitor",
        "profile:read"
      ]
    },
    {
      "id": "create_booking",
      "name": "Create booking",
      "description": "Request a booking for a service at a slot from check_availability. Returns status 'pending_human' — the owner confirms.",
      "tags": [
        "visitor",
        "booking:create"
      ]
    },
    {
      "id": "request_payment_link",
      "name": "Request payment link",
      "description": "Create a payment request for a priced service. Agent requests need the profile owner's approval before a checkout link is issued.",
      "tags": [
        "visitor",
        "payment:request"
      ]
    },
    {
      "id": "submit_lead",
      "name": "Submit lead",
      "description": "Send the profile owner your human's contact details and a note so they can follow up.",
      "tags": [
        "visitor",
        "lead:submit"
      ]
    },
    {
      "id": "list_my_profiles",
      "name": "List my profiles",
      "description": "List profiles owned by the human who issued this API key (id, handle, status).",
      "tags": [
        "admin",
        "profile:draft"
      ]
    },
    {
      "id": "create_profile_draft",
      "name": "Create profile draft",
      "description": "Create a new DRAFT profile for your human. Content is marked unverified until the human approves a publish request.",
      "tags": [
        "admin",
        "profile:draft"
      ]
    },
    {
      "id": "upload_document",
      "name": "Upload document",
      "description": "Add knowledge to a profile from a public URL or plain text. Ingestion is async: status queued -> processing -> ready|failed.",
      "tags": [
        "admin",
        "docs:write"
      ]
    },
    {
      "id": "update_services",
      "name": "Update services",
      "description": "Replace a profile's services (name, description, price, currency, duration_min). Agent edits stay unverified/hidden until the owner approves.",
      "tags": [
        "admin",
        "profile:edit"
      ]
    },
    {
      "id": "list_leads",
      "name": "List leads",
      "description": "Leads and handoff requests for a profile, newest first.",
      "tags": [
        "admin",
        "leads:read"
      ]
    },
    {
      "id": "get_analytics",
      "name": "Get analytics",
      "description": "Visits, chats, human vs agent traffic, top questions for a profile.",
      "tags": [
        "admin",
        "leads:read"
      ]
    },
    {
      "id": "request_publish",
      "name": "Request publish",
      "description": "Ask the human owner to approve publishing (agents can never publish directly).",
      "tags": [
        "admin",
        "publish:request"
      ]
    }
  ]
}