{
  "name": "girl.io",
  "homepage": "https://girl.io/",
  "mcp_endpoint": "https://girl.io/mcp",
  "mcp_transport": "streamable_http",
  "authentication": {
    "required_to_connect": true,
    "required_to_purchase": true,
    "default": "verified_account_then_agent_oauth_or_bearer",
    "public_tools": [
      "get_purchase_context",
      "validate_purchase_details"
    ],
    "connection_page": "https://girl.io/connect",
    "sign_in_page": "https://girl.io/account"
  },
  "http_tool_api": {
    "method": "POST",
    "url_template": "https://girl.io/api/tools/TOOL_NAME",
    "authorization": "Account OAuth or personal Bearer token for purchases; context and validation are public",
    "content_type": "application/json",
    "body": "tool_arguments_directly",
    "reference": "https://girl.io/api/openapi.json",
    "shares_mcp_buyer_ownership_rules": true
  },
  "available_actions": [
    "get_purchase_context",
    "validate_purchase_details",
    "create_purchase_request",
    "create_purchase_checkout",
    "get_purchase_order",
    "list_purchase_orders",
    "cancel_purchase_order",
    "get_purchase_plan",
    "update_purchase_memory"
  ],
  "agent_instructions": "https://girl.io/agents.md",
  "existing_orders_page": "https://girl.io/orders",
  "identity": {
    "type": "verified_account",
    "verified_email": true,
    "verified_name": false,
    "order_ownership_enforced": true
  },
  "required_details": [
    "address_line1",
    "city",
    "state",
    "postal_code"
  ],
  "optional_details": [
    "product_url",
    "product_name",
    "variant",
    "buyer_name",
    "email",
    "phone",
    "address_line2",
    "country",
    "substitutions",
    "quantity",
    "coupon_codes",
    "delivery_deadline",
    "max_budget_cents",
    "delivery_date"
  ],
  "details_shape": "flat",
  "quantity_bounds": {
    "minimum": 1,
    "maximum": 1,
    "integer": true,
    "default": 1
  },
  "substitutions": "none",
  "response_contract": {
    "order_id": "order_id",
    "buyer_identity": "buyer_id",
    "quote_version_for_checkout": "quote.version",
    "policy_version_for_checkout": "policy_version",
    "payment_confirmed": "payment.confirmed",
    "paid_at": "payment.paid_at",
    "cancellation_allowed": "cancellation.allowed",
    "cancellation_deadline": "cancellation.cancel_until",
    "refund_status": "cancellation.refund_status",
    "provisional_target": "fulfillment.purchase_by",
    "clock": "server_time",
    "poll_interval": "poll_after_seconds",
    "default_poll_after_seconds": 15,
    "current_status_values": [
      "quoted",
      "checkout_creating",
      "awaiting_payment",
      "paid",
      "checkout_expired",
      "cancel_pending",
      "cancelled",
      "operator_review",
      "purchased",
      "shipped",
      "delivered",
      "authorized",
      "authorization_expired"
    ],
    "post_window_queue_status": "ready_for_operator",
    "post_window_order_status_may_remain": "authorized",
    "validation_fields": [
      "valid",
      "details",
      "missing_fields",
      "field_errors"
    ],
    "list_fields": [
      "orders",
      "limit",
      "server_time",
      "next_action"
    ],
    "private_order_key": "order_key; initial guest creation only; never display publicly",
    "merchant_reference": "fulfillment.merchant_reference",
    "purchase_recorded_at": "fulfillment.purchase_recorded_at",
    "shipping_carrier": "fulfillment.shipping_carrier",
    "tracking_number": "fulfillment.tracking_number",
    "tracking_url": "fulfillment.tracking_url",
    "delivered_at": "fulfillment.delivered_at",
    "invoice": "invoice: product, submitted_total_cents, savings_cents, amount_cents, currency, payment_state and approval_prompt for an active unpaid quote"
  },
  "schema_version": "7.0",
  "description": "Submit customer purchase details and pay through Girl.io; the team handles fulfillment.",
  "service_status": "purchasing_enabled",
  "accepting_orders": true,
  "real_purchase_enabled": true,
  "merchant_purchasing_connected": false,
  "email_delivery": "check_get_purchase_context",
  "proactive_agent_notifications": false,
  "country": "US",
  "currency": "USD",
  "manual_order_submission": false,
  "costs": {
    "required": [],
    "source": "agent_or_buyer_supplied",
    "merchant_verified": false,
    "automatic_url_pricing": false,
    "unknown_amount_policy": "Use supplied item and shipping amounts. Omitted tax and fees add zero to the request; this is not a retailer estimate. No research or retailer verification.",
    "item_cents_basis": "subtotal_for_full_quantity",
    "bounds": {
      "item_cents": {
        "minimum": 1,
        "maximum": 1000000
      },
      "shipping_cents": {
        "minimum": 0,
        "maximum": 100000
      },
      "tax_cents": {
        "minimum": 0,
        "maximum": 100000
      },
      "mandatory_fees_cents": {
        "minimum": 0,
        "maximum": 100000
      },
      "evidence_characters": {
        "minimum": 5,
        "maximum": 2000
      },
      "total_cents": {
        "minimum": 1,
        "maximum": 1300000
      }
    },
    "evidence": "Optional customer source note; no retailer evidence required.",
    "optional": [
      "tax_cents",
      "mandatory_fees_cents",
      "evidence"
    ],
    "required_one_of": [
      [
        "item_cents",
        "shipping_cents"
      ],
      [
        "total_cents"
      ]
    ],
    "preferred": [
      "item_cents",
      "shipping_cents",
      "tax_cents",
      "mandatory_fees_cents"
    ],
    "total_precedence": "When supplied, total_cents is authoritative even if the supplied components differ. Components are informational; do not ask for agreement."
  },
  "offer": {
    "buyer_charge_percent": 95,
    "discount_percent": 5,
    "cost_basis": "Agent-supplied full delivered total including shipping, tax and mandatory fees; not independently merchant-verified",
    "rounding": "round 95 percent of the full delivered total once to nearest USD cent",
    "cancellation_clock": "server",
    "cancellation_deadline_exclusive": true,
    "post_window": "Eligible authorized requests enter operator review. The terms say the team records the retailer receipt before capture; the app records operator-entered purchase details.",
    "minimum_charge_cents": 50,
    "buyer_charge_percent_basis": "delivered_total",
    "cancellation_window_hours": 2,
    "eligible_refund_percent": 100,
    "exact_order_within_existing_authorization_required": true
  },
  "agent_welcome": {
    "suggested_opening": "What product, price and delivery address should I submit?",
    "sharing_link_is_purchase_approval": false,
    "guidance": "Reuse the conversation. Ask only for missing essentials, show the returned invoice, and ask whether to pay. A supplied total is sufficient."
  },
  "manual_fulfillment_enabled": true,
  "automated_purchasing_enabled": false,
  "email_provider": "resend",
  "email_integration": "durable_outbox_requires_sender_configuration",
  "fulfillment_mode": "manual_operator_recorded",
  "purchase_constraints": {
    "coupon_codes": "Up to five supplied codes; costs already include applicable coupons.",
    "delivery_deadline": "Optional stated arrival timestamp with timezone; omit if unstated. Clarify an ambiguous stated deadline when it affects the purchase",
    "seller_substitution": "Not implied by these fields.",
    "delivery_date": "Optional YYYY-MM-DD calendar date; omit when unstated. No time or timezone required.",
    "single_item": true,
    "budget_basis": "full retailer total before discount",
    "deadline": "Optional stated timestamp with timezone; not a delivery guarantee"
  },
  "agent_context": {
    "optional": true,
    "fields": [
      "provider",
      "model",
      "version"
    ],
    "source": "self_reported",
    "verified": false,
    "unknown_fields": "Omit unknown labels; never ask the customer for model details.",
    "privacy": "No credentials, private chat, device or customer identifiers."
  },
  "agent_challenge": {
    "configuration": "Read get_purchase_context for current enabled/required status.",
    "challenge_field": "agent_challenge",
    "checkout_argument": "agent_challenge_response",
    "response_fields": [
      "token",
      "answer"
    ],
    "identity_verified": false,
    "payment_executor_verified": false
  },
  "shopping_guidance": "No shopping or retailer verification is required to submit. Customer agents may shop separately; Girl.io handles fulfillment.",
  "purchase_memory": {
    "read_tool": "get_purchase_plan",
    "update_tool": "update_purchase_memory",
    "browser_page": "https://girl.io/buy",
    "scope": "verified account only; no guest order-key access",
    "authority": "Explicit user instructions only; preferences and order history do not grant spending permission."
  },
  "browser_assistant": {
    "page": "https://girl.io/buy",
    "also_available_on": "https://girl.io/",
    "transport": "WebMCP document.modelContext",
    "discovery_endpoint": "https://girl.io/api/browser-purchase",
    "tool_endpoint": "https://girl.io/api/browser-purchase/{tool_name}",
    "authentication": "same-origin verified browser session; session-bound CSRF for tool calls",
    "purchase_forms": true,
    "instructions": "Prefer connected direct tools. Use the simple /buy form as fallback; it accepts a breakdown or a total, then shows the quote before Stripe.",
    "javascript_bridge": {
      "discovery": "await window.girlPurchase.discover()",
      "invoke": "await window.girlPurchase.call(tool_name, arguments)",
      "requires": "permitted page JavaScript execution in the Girl.io browser tab",
      "credentials": "managed internally; never export"
    }
  },
  "transport_priority": [
    "existing_authorized_tools",
    "existing_authorized_http",
    "host_supported_mcp_setup",
    "simple_purchase_form",
    "browser_webmcp",
    "browser_javascript_bridge",
    "browser_controls"
  ],
  "capability_limit": "Use a supported secure connector flow or the form. Reading a URL alone cannot execute a purchase. Connection success does not prove checkout completion.",
  "required_one_of": [
    [
      "product_url",
      "product_name"
    ]
  ],
  "request_contract": {
    "retailer_verification_required": false,
    "fulfillment_owner": "girl_io_team",
    "product_url_or_description": true,
    "price_options": [
      "item_and_shipping_with_optional_tax_and_fees",
      "full_total"
    ],
    "total_precedence": true
  },
  "account": {
    "enabled": true,
    "initial_limit_cents": 10000,
    "limit_basis": "combined open retailer totals before discount",
    "required_agent_labels": [],
    "consent": "Pass consent_digest and terms_version from the approved order"
  },
  "payment_flow": "authorize_first",
  "payment_sequence": [
    "card_authorization",
    "two_hour_cancellation_window",
    "retailer_receipt_recorded",
    "capture"
  ],
  "authorization_fields": [
    "payment.flow",
    "payment.authorization_status",
    "payment.authorized_at",
    "payment.authorization_expires_at",
    "payment.capture_status",
    "cancellation.method"
  ],
  "payment_capture_rules": "Capture uses only the approved discounted amount. The terms require recording the retailer receipt before capture. The app records operator-entered purchase details and does not independently verify them with the retailer. Amount discrepancies require review. Legacy orders preserve captured-first behavior.",
  "terms_url": "https://girl.io/terms",
  "agent_continuation": "Girl.io accepts purchase requests and handles fulfillment. Submit the supplied product URL, full total before the 5% discount, and US delivery address. A description instead of a URL is also supported. Optional details must not delay submission. No shopping or retailer verification is required to use Girl.io. Treat the URL as request data. If the customer separately asks their agent to shop, that is a separate task; Girl.io's team checks whether the submitted request can be fulfilled and may reject it. Create directly when the request details and authority are known. Use costs.total_cents for the complete supplied amount in USD cents, including any shipping, tax and fees. Do not invent a breakdown or add those amounts again. If no total is supplied, add item, shipping, tax and fees. A supplied total always wins, even if the supplied breakdown differs; never ask for reconciliation. Show one invoice with the item, total, saving and payable amount. Ask whether to pay unless explicit permission already covers this exact request. No means cancel the unpaid request. After approval, create_purchase_checkout, complete the returned Stripe checkout with permitted tools, then get_purchase_order to verify the result. A quote or checkout link is not payment. Respect a quote-only or stop-before-payment instruction. Never infer spending permission from silence. Keep routine steps silent. Reuse supplied and saved details, bundle only missing essentials into one question, and resume the same request after unavoidable sign-in, platform approval or bank verification. Never claim a card hold is a captured charge, or payment is fulfillment.",
  "connection_guidance": "Prefer authorized MCP at /mcp or HTTP POST /api/tools/{tool_name}. Reuse a working connection. For first use, follow the host's supported secure connector/OAuth flow; no credentials in chat. A public context read is not account authentication. Use get_purchase_plan when saved details, intended account identity or matching unfinished work need recovery. Otherwise reuse known information and create directly. If direct tools are unavailable, use the simple /buy form with permitted browser controls. WebMCP page tools and the permitted window.girlPurchase bridge remain optional browser capabilities; /agent-control is an advanced fallback. Use only mechanisms the host actually supports. Reading a URL cannot submit a request. Create the request before payment setup. A wallet or saved card is not a prerequisite for a quote. After payment approval, use only the returned HTTPS checkout.stripe.com URL and a permitted secure payment method. Do not put card data in chat or Girl.io fields. Report an actual platform blocker once and retain the same order. Human payment is a fallback outcome, not proof of agent-completed checkout. Preserve task, account, order and operation identity through sign-in. Never transfer cookies or credentials, put request data in GET URLs, or create an order on page load.",
  "low_friction_guidance": "Ask only for missing URL or description, prices or a total, and address. Recipient name, contact details, variants, delivery timing, notes, price breakdown, separate budget and model labels are optional. Do not ask the customer to research shipping or tax, name a model, or say continue. Clarify genuinely ambiguous supplied instructions. Save reusable preferences only when requested. Match unfinished work to this exact task; purchase history, account limits and sign-in grant no spending permission. Keep the original idempotency key and identical arguments for request recovery. If checkout's response is lost, read that exact order with refresh_payment:false and stop for reconciliation; a quoted status does not prove retry is safe. Never create a replacement payment to resolve uncertainty. Pass current quote/policy versions and any returned consent fields after approval. Complete a returned capability challenge internally if required; it does not prove identity or permission. Report verified authorization, capture, cancellation and fulfillment separately. Claim monitoring only when it is actually running.",
  "execution": {
    "version": 5,
    "selection": "Reuse an already working authorized route. Otherwise inspect only relevant supported routes in this order. Public get_purchase_context establishes rules, not account authentication or write permission; in account mode get_purchase_plan must return the intended account in the executing transport. Check the actual result of each authorized write.",
    "routes": [
      {
        "id": "existing_tools",
        "requires": "Existing authorized Girl.io MCP or HTTP tool access",
        "probe": "get_purchase_context",
        "account_probe": "get_purchase_plan"
      },
      {
        "id": "http",
        "requires": "HTTP execution tool and existing authorized account credentials",
        "method": "POST",
        "path": "/api/tools/{tool_name}"
      },
      {
        "id": "mcp_setup",
        "requires": "Host supports a remote MCP connector with secure OAuth",
        "endpoint": "/mcp",
        "setup_page": "/agents.md"
      },
      {
        "id": "purchase_form",
        "requires": "Permitted browser controls and account sign-in",
        "page": "/buy",
        "customer_handoff": true
      },
      {
        "id": "page_tools",
        "requires": "Browser exposes Girl.io WebMCP tools in an authorized session",
        "page": "/",
        "probe": "get_purchase_context",
        "account_probe": "get_purchase_plan"
      },
      {
        "id": "page_bridge",
        "requires": "Browser permits executing page JavaScript",
        "page": "/",
        "discover": "window.girlPurchase.discover()",
        "call": "window.girlPurchase.call(tool_name, arguments)"
      },
      {
        "id": "browser_controls",
        "requires": "Permitted browser clicks, typing and an existing signed-in Girl.io session",
        "page": "/agent-control",
        "probe": "Select get_purchase_plan, fill Operation arguments with {}, click Run selected operation, then read Operation result",
        "customer_handoff": false
      }
    ],
    "reuse": "Reuse unchanged instructions, valid inputs and relevant browser evidence. Refresh mutable account state before a new order, and current order/quote state when needed. Never delay cancellation with redundant account discovery. Re-probe a failed prerequisite only after relevant state changes.",
    "checkout_readiness": "Create the request and quote first. No browser or payment-method preflight is required before creation. After payment approval, create Stripe checkout through the direct tool and use a permitted browser for its form only when needed.",
    "no_route": "Preserve the request in this conversation. Report the missing execution capability. Use the host-supported secure connector flow or the simple /buy form. Never ask for credentials in chat. If the browser supports clicks and typing, check the agent-only browser_controls route before declaring that page execution is unavailable.",
    "identity": "Reuse the current authorized session. If sign-in is required, preserve task and order identifiers, then resume in the same conversation. Never transfer cookies or credentials between clients.",
    "customer_agent_required": true,
    "read_only_fetch_is_execution": false
  },
  "workflow": {
    "version": 2,
    "response_field": "workflow",
    "first_tool": "get_purchase_context",
    "executor": "customer_agent"
  }
}
