{
  "protocolVersion": "0.3.0",
  "name": "Teppek",
  "description": "Agent-accessible map of global supply & demand — jobs, real estate, vehicles and services across 27 locales. A registered user's AI assistant can search listings, reach out, and publish listings on the user's behalf. Primary protocol is MCP (mcp.teppek.com); a REST agent API is also available.",
  "version": "1.0.0",
  "url": "https://mcp.teppek.com/mcp",
  "preferredTransport": "JSONRPC",
  "supportedInterfaces": [
    { "url": "https://mcp.teppek.com/mcp", "transport": "JSONRPC" },
    { "url": "https://api.teppek.com/agent", "transport": "HTTP+JSON" }
  ],
  "additionalInterfaces": [
    { "url": "https://api.teppek.com/agent", "transport": "HTTP+JSON" }
  ],
  "provider": {
    "organization": "Teppek",
    "url": "https://www.teppek.com"
  },
  "documentationUrl": "https://www.teppek.com/auth.md",
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "stateTransitionHistory": false,
    "extensions": [
      {
        "uri": "https://github.com/google-agentic-commerce/AP2/tree/v0.1.0",
        "description": "Agent Payments Protocol (AP2). Teppek is a merchant, but the agent has no wallet and does NOT settle payment per call: it spends the user's ACCOUNT package credits (1 credit = 1 USD), exactly like the human owner. The first supply + demand listing is free; beyond that, publishing and premium visibility (gold/flare) draw from the account's package/membership. The human owner buys a package (Pro/Pro+/Business) at https://www.teppek.com/pricing with card (Paddle) or on-chain USDC (Base), and the agent spends those credits. A 402 (PIN_PUBLISH_CREDITS_REQUIRED / AGENT_INSUFFICIENT_CREDITS) or 409 (ACTIVE_LISTING_LIMIT_REACHED) means the account needs a package top-up — relay to the user, who tops up, then the agent retries. Search, read, messaging and post-publish management are free. Prices, all error codes + example prompts: https://www.teppek.com/auth.md and /openapi.json.",
        "required": false,
        "params": {
          "roles": ["merchant"]
        }
      }
    ]
  },
  "defaultInputModes": ["application/json", "text/plain"],
  "defaultOutputModes": ["application/json", "text/plain"],
  "securitySchemes": {
    "oauth2": {
      "type": "oauth2",
      "description": "Preferred: OAuth 2.1 \"Connect with Teppek\" (RFC 8414 discovery + dynamic client registration). See https://www.teppek.com/auth.md",
      "flows": {
        "authorizationCode": {
          "authorizationUrl": "https://mcp.teppek.com/authorize",
          "tokenUrl": "https://mcp.teppek.com/token",
          "scopes": {
            "read": "Search and read listings",
            "contact": "Message listing owners on the user's behalf",
            "write:listing": "Create and manage the user's own listings"
          }
        }
      }
    },
    "agentKey": {
      "type": "apiKey",
      "in": "header",
      "name": "X-Agent-Key",
      "description": "Fallback for non-OAuth clients — per-user API key issued at https://www.teppek.com (Dashboard → API Keys). Prefer the OAuth flow above. See https://www.teppek.com/auth.md"
    }
  },
  "security": [{ "oauth2": ["read", "contact", "write:listing"] }, { "agentKey": [] }],
  "skills": [
    {
      "id": "search_listings",
      "name": "Search listings",
      "description": "Search Teppek listings by vertical (jobs/real_estate/vehicle/service), supply/demand intent, role, text and price. Use intent_type:\"demand\" to find people seeking.",
      "tags": ["search", "listings", "jobs", "real-estate", "vehicles", "services"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "semantic_search",
      "name": "Semantic search",
      "description": "Meaning-based semantic search over live Teppek listings using a multilingual embedding index — matches natural-language intent rather than exact keywords. Optional vertical filter; returns the closest ACTIVE listings ranked by semantic similarity.",
      "tags": ["search", "semantic", "listings", "embeddings"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "get_listing",
      "name": "Get listing",
      "description": "Fetch a single listing by id with full detail.",
      "tags": ["listings", "detail"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "send_message",
      "name": "Message a listing",
      "description": "Message the owner of a listing on the user's behalf — the primary contact path (no price-offer/accept/reject flow). Native listings open a private thread; external-feed listings return a redirect to the source's application URL. Contact flows through Teppek; raw personal details are never exposed.",
      "tags": ["contact", "message"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "create_listing",
      "name": "Create listing",
      "description": "Publish a listing on the user's behalf across the 4 verticals and 12 roles. Consumes credits and is held for AI moderation (starts pending); credits refunded on honest rejection, forfeited for prohibited/spam content.",
      "tags": ["listings", "publish", "write"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "list_my_listings",
      "name": "List my listings",
      "description": "List the authenticated user's OWN listings (any status), newest first. Resolved server-side from the agent key's userId.",
      "tags": ["listings", "account"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "list_conversations",
      "name": "List conversations",
      "description": "List the authenticated user's message threads across their listings, newest first.",
      "tags": ["messages", "account"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "get_conversation",
      "name": "Get conversation",
      "description": "Read one of the user's OWN message threads by id — its messages in order.",
      "tags": ["messages", "detail"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "get_entitlements",
      "name": "Get entitlements",
      "description": "Read the authenticated user's plan, credit balance, listing limits and can_create_listing — check before publishing.",
      "tags": ["account", "entitlements"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "purchase_package",
      "name": "Purchase credit package",
      "description": "Top up the account with USDC (Base): buy a package (pro/pro_plus/business) so the agent can keep publishing autonomously. Call with pack_key for on-chain payment instructions (402), send the USDC, then call again with pack_key + payment_tx to credit the account. Same packages a human buys; not a per-listing payment.",
      "tags": ["account", "billing", "payment", "x402"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "update_listing",
      "name": "Update listing",
      "description": "Edit title/description/price/currency on one of the user's own listings. Vertical/intent/role/location are fixed. Editing is free.",
      "tags": ["listings", "write"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "delete_listing",
      "name": "Delete listing",
      "description": "Soft-delete one of the user's own listings. Only the owner can delete. No credit refund.",
      "tags": ["listings", "write"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "set_listing_status",
      "name": "Set listing status",
      "description": "Mark the user's own listing sold, hide it, or re-activate a hidden one. Free (no credit); cannot set moderation states.",
      "tags": ["listings", "write"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "renew_listing",
      "name": "Renew listing",
      "description": "Extend one of the user's own listings by another 30 days. Free (no credit); reviving an expired listing returns it to active.",
      "tags": ["listings", "write"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "reply_to_conversation",
      "name": "Reply to conversation",
      "description": "Reply into one of the user's own message threads by id; the message goes to the other participant (owner or inquirer). Contact routes through Teppek.",
      "tags": ["messaging", "contact"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "update_listing_images",
      "name": "Update listing images",
      "description": "Add and/or remove photos on the user's own listing (max 6). Adding re-triggers AI moderation (listing returns to pending); removing does not. Free (no credit).",
      "tags": ["listings", "write"],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    }
  ]
}
