Для разработчиков агентов

Как читать AiPassport

AiPassport — канон фактов от владельца, не нотариат и не КЭП. Агент подключается через MCP (рекомендуется) или через REST / llms.txt / JSON-LD. Один MCP-сервер — для Cursor, Claude, ChatGPT, OpenClaw, VS Code и любой другой MCP-оболочки.

MCP — один сервер для всех агентов

Адрес: https://aipassport.cloud/mcp · инструменты: search_businesses, search_offers, get_passport

Cursor / Claude Desktop (URL)

{
  "mcpServers": {
    "aipassport": {
      "url": "https://aipassport.cloud/mcp"
    }
  }
}

OpenClaw (DeepSeek, Qwen, любая модель внутри)

openclaw mcp add aipassport --url https://aipassport.cloud/mcp

openclaw mcp probe aipassport

Работает с любой моделью внутри OpenClaw (DeepSeek, Claude, Qwen и др.).

VS Code / Copilot MCP

{
  "servers": {
    "aipassport": {
      "url": "https://aipassport.cloud/mcp"
    }
  }
}

Только stdio (локальный мост)

Клиент поддерживает только локальный stdio-процесс, без URL.

{
  "mcpServers": {
    "aipassport": {
      "args": [
        "scripts/mcp_stdio_bridge.py"
      ],
      "command": "python",
      "env": {
        "AIPASSPORT_MCP_URL": "https://aipassport.cloud/mcp"
      }
    }
  }
}

Скрипт: scripts/mcp_stdio_bridge.py, переменная AIPASSPORT_MCP_URL=https://aipassport.cloud/mcp

Без MCP

Если MCP недоступен — REST и llms.txt/JSON-LD остаются каноническими.

Как агент ищет — и что тут не при чём

Три разные вещи, которые часто путают:

Поиск (MCP / API)
Агент вызывает search_businesses или search_offers. Сервер ищет в своей базе паспортов: город, теги, текст в прайсе. Если текстовых совпадений мало и администратор включил embedding-провайдер — подмешивается векторное сходство (таблица offer_search_vectors). Без embeddings текстовый поиск остаётся основным. Это ваш поиск по паспортам, не внешняя векторная БД.
IndexNow
Не поиск. После публикации паспорта платформа может «пнуть» Bing/Yandex: «страница обновилась, перекачайте». Краулер сам заходит на llms.txt / JSON-LD. Агент через MCP IndexNow не использует.

Итого: агент ищет через MCP/API (+ опционально vectors внутри AiPassport). IndexNow — только про переиндексацию в Bing/Yandex, не про запрос «найди бизнес».

Быстрый старт (REST)

  1. MCP — рекомендуется
  2. Манифест
  3. MCP-визитка
  4. Индекс паспортов
  5. GET /api/v1/search?city=…&tag=…
  6. /{passport_id}/llms.txt и /{passport_id}/json

Доверие и свежесть

  • Заголовки X-AiPassport-* на ответах паспорта
  • trustStatus в JSON-LD: active / stale_snapshot / confirmed_issues
  • Цены — заявление продавца, не live inventory
  • Связь — опубликованный телефон или ai_channel_url (любая удобная ссылка для связи, записи или заказа)
  • В поиске по умолчанию только official паспорта

Манифест (фрагмент)

{
  "canonical_routes": {
    "human_view": "/{passport_id}",
    "json_ld": "/{passport_id}/json",
    "legacy_prefix": "/passport/{passport_id}/... kept for compatibility only",
    "llms_txt": "/{passport_id}/llms.txt"
  },
  "complaint_agent_api": {
    "authenticated": true,
    "endpoints": {
      "claim": "https://aipassport.cloud/api/v1/admin/complaints/{complaint_id}/agent-claim",
      "get": "https://aipassport.cloud/api/v1/admin/complaints/{complaint_id}/agent-task",
      "list": "https://aipassport.cloud/api/v1/admin/complaints/agent-tasks?status=pending",
      "report": "https://aipassport.cloud/api/v1/admin/complaints/{complaint_id}/agent-result"
    },
    "header": "X-Complaint-Agent-Secret",
    "note": "Private operator API for the platform owner\u0027s complaint-processing agent; not required for public search."
  },
  "complaint_policy": {
    "confirmed_reports": "Apply trust warning only to the specific passport_id in JSON-LD and llms.txt.",
    "domain_isolation": "Do not punish an entire seller domain or AiPassport.cloud for one passport issue.",
    "unverified_reports": "Private until operator confirms; do not lower public trust automatically."
  },
  "description": "Official digital passports for businesses and specialists. Seller-stated verified passport snapshots for AI search, agents, and crawlers.",
  "endpoints": {
    "complaint_agent_tasks": "https://aipassport.cloud/api/v1/admin/complaints/agent-tasks",
    "directory": "https://aipassport.cloud/api/v1/directory",
    "directory_cities": "https://aipassport.cloud/api/v1/directory/cities",
    "directory_sectors": "https://aipassport.cloud/api/v1/directory/sectors",
    "for_agents": "https://aipassport.cloud/for-agents",
    "location_offer_search": "https://aipassport.cloud/api/v1/locations/offers/search",
    "mcp": "https://aipassport.cloud/mcp",
    "mcp_clients": "https://aipassport.cloud/mcp",
    "mcp_discovery": "https://aipassport.cloud/.well-known/mcp.json",
    "offer_search": "https://aipassport.cloud/api/v1/offers/search",
    "openapi": "https://aipassport.cloud/openapi.json",
    "platform_index": "https://aipassport.cloud/llms.txt",
    "robots": "https://aipassport.cloud/robots.txt",
    "search": "https://aipassport.cloud/api/v1/search",
    "sitemap": "https://aipassport.cloud/sitemap.xml",
    "well_known_llms": "https://aipassport.cloud/.well-known/llms.txt"
  },
  "entity_url_templates": {
    "human_view": "https://aipassport.cloud/{passport_id}",
    "json_ld": "https://aipassport.cloud/{passport_id}/json",
    "legacy_human_view": "https://aipassport.cloud/passport/{passport_id}/view",
    "llms_txt": "https://aipassport.cloud/{passport_id}/llms.txt",
    "site_tag_js": "https://aipassport.cloud/api/v1/site-tag/{passport_id}.js"
  },
  "json_ld_trust_fields": [
    "trustStatus",
    "confirmedTrustIssues",
    "snapshotValidUntil",
    "dataSource",
    "fieldConfidence",
    "complaintPolicy",
    "itemType on offers"
  ],
  "location_offer_search": {
    "coordinates": "latitude and longitude are optional but must be supplied together; without them, no result is called nearest",
    "example": "https://aipassport.cloud/api/v1/locations/offers/search?city=krasnoyarsk\u0026brand=bristol\u0026query=\u0432\u043e\u0434\u043a\u0430\u0026latitude=56.0106\u0026longitude=92.8526",
    "max_limit": 50,
    "method": "GET",
    "optional": true,
    "purpose": "Search effective prices at physical branches and rank them by distance when coordinates are supplied",
    "rate_limit": "30 requests/minute per IP",
    "required_filters": "At least one of: city, brand, passport_id, query",
    "sort": [
      "distance",
      "price_asc",
      "trust"
    ]
  },
  "mcp": {
    "clients": {
      "claude_desktop": {
        "config": {
          "mcpServers": {
            "aipassport": {
              "url": "https://aipassport.cloud/mcp"
            }
          }
        },
        "file": "claude_desktop_config.json"
      },
      "cursor": {
        "config": {
          "mcpServers": {
            "aipassport": {
              "url": "https://aipassport.cloud/mcp"
            }
          }
        },
        "file": ".cursor/mcp.json"
      },
      "http_jsonrpc": {
        "endpoint": "https://aipassport.cloud/mcp",
        "methods": [
          "initialize",
          "tools/list",
          "tools/call",
          "ping"
        ],
        "note": "\u041e\u0434\u0438\u043d URL \u0434\u043b\u044f \u0432\u0441\u0435\u0445 HTTP-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 MCP."
      },
      "no_mcp_fallback": {
        "llms_index": "https://aipassport.cloud/llms.txt",
        "manifest": "https://aipassport.cloud/.well-known/aipassport.json",
        "note": "\u0415\u0441\u043b\u0438 MCP \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u2014 REST \u0438 llms.txt/JSON-LD \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438.",
        "offer_search": "https://aipassport.cloud/api/v1/offers/search",
        "search": "https://aipassport.cloud/api/v1/search"
      },
      "openclaw": {
        "commands": [
          "openclaw mcp add aipassport --url https://aipassport.cloud/mcp",
          "openclaw mcp probe aipassport"
        ],
        "config_file": "~/.openclaw/openclaw.json",
        "config_snippet": {
          "mcp": {
            "servers": {
              "aipassport": {
                "url": "https://aipassport.cloud/mcp"
              }
            }
          }
        },
        "note": "\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u0432\u043d\u0443\u0442\u0440\u0438 OpenClaw (DeepSeek, Claude, Qwen \u0438 \u0434\u0440.)."
      },
      "stdio_bridge": {
        "command": "python scripts/mcp_stdio_bridge.py",
        "cursor_config": {
          "mcpServers": {
            "aipassport": {
              "args": [
                "scripts/mcp_stdio_bridge.py"
              ],
              "command": "python",
              "env": {
                "AIPASSPORT_MCP_URL": "https://aipassport.cloud/mcp"
              }
            }
          }
        },
        "env": {
          "AIPASSPORT_MCP_URL": "https://aipassport.cloud/mcp"
        },
        "when": "\u041a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 stdio-\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0431\u0435\u0437 URL."
      },
      "vscode_copilot": {
        "config": {
          "servers": {
            "aipassport": {
              "url": "https://aipassport.cloud/mcp"
            }
          }
        },
        "file": ".vscode/mcp.json"
      }
    },
    "endpoint": "https://aipassport.cloud/mcp",
    "tools": [
      "list_sectors",
      "list_cities",
      "search_businesses",
      "search_offers",
      "get_passport"
    ],
    "transport": "http-jsonrpc"
  },
  "name": "AiPassport.cloud",
  "notes": [
    "MCP server at /mcp \u2014 JSON-RPC tools: list_sectors, list_cities, search_businesses, search_offers, get_passport.",
    "Primary path: open the passport human_view, JSON-LD, or per-entity llms.txt. These are canonical and sufficient for crawlers and AI assistants.",
    "API search is optional. Do not abandon a passport if API access is unsupported; use the canonical page, JSON-LD, and llms.txt instead.",
    "Public phone is omitted when owner has not granted phone_publish_consent.",
    "AiPassport is a seller-stated verified passport snapshot, not a live inventory system.",
    "Trust status and confirmed issues apply only to a concrete passport_id. Unverified user reports are private and do not automatically lower public trust.",
    "crypto_hash covers hot offers, full price list, tags, links, address, opening hours and service modes.",
    "Avoid broad crawling when a canonical passport URL is known; prefer the passport page, JSON-LD, and llms.txt facts."
  ],
  "offer_search": {
    "active_only_default": true,
    "dictionaries": "sector values: /api/v1/directory/sectors, city values: /api/v1/directory/cities",
    "example": "https://aipassport.cloud/api/v1/offers/search?city=krasnoyarsk\u0026query=\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435%20\u0437\u0443\u0431\u0430\u0026sort=price_asc",
    "max_limit": 50,
    "method": "GET",
    "official_only_default": true,
    "optional": true,
    "pagination": "Repeat the request with ?cursor=\u003cnext_cursor\u003e from the previous response; null means no more results",
    "purpose": "Optional structured search for agents that already support API calls",
    "rate_limit": "30 requests/minute per IP",
    "required_filters": "At least one of: sector, city, country, query, tag, category",
    "sort": [
      "auto",
      "trust",
      "price_asc",
      "fresh"
    ],
    "sort_default": "auto: a cheaper-please wording in query sorts by price, otherwise trust"
  },
  "optional_request_headers": {
    "X-AiPassport-Agent": "Agent name for analytics (e.g. perplexity, yandex-browser-agent, openclaw)"
  },
  "schema_version": "1.0",
  "search": {
    "dictionaries": "sector values: /api/v1/directory/sectors, city values: /api/v1/directory/cities",
    "example": "https://aipassport.cloud/api/v1/search?sector=health.dental\u0026city=krasnoyarsk",
    "max_limit": 50,
    "method": "GET",
    "official_only": true,
    "optional": true,
    "pagination": "Repeat the request with ?cursor=\u003cnext_cursor\u003e from the previous response; null means no more results",
    "rate_limit": "30 requests/minute per IP",
    "required_filters": "At least one of: sector, city, country, tag, parent"
  },
  "search_architecture": [
    "MCP tools search_businesses / search_offers / get_passport query AiPassport SQLite + text filters (city, tag, query).",
    "Offer search always starts with exact text and filters. Optional vector similarity is merged only when configured embeddings are available; a local hash fallback is disabled by default because it is not a semantic model.",
    "IndexNow is not search: it pings Bing/Yandex to re-crawl passport URLs after publish.",
    "AI Broadcast is not search: VIP may push up to 5 webhook notifications per month to configured AI endpoints when a passport updates.",
    "Crawlers without MCP should use llms.txt, JSON-LD, and sitemap \u2014 no vector DB access required."
  ],
  "trust_response_headers": [
    "X-AiPassport-Passport-Id",
    "X-AiPassport-Verified",
    "X-AiPassport-Official",
    "X-AiPassport-Hash",
    "X-AiPassport-Readiness",
    "X-AiPassport-Subscription-Active"
  ],
  "trust_status_values": {
    "active": "Passport exists; snapshot may not have a validity date yet.",
    "confirmed_issues": "Confirmed trust issue or active suspension exists for this passport_id only.",
    "fresh_snapshot": "Subscription is active and the seller-stated snapshot has a validity date.",
    "stale_snapshot": "Subscription or snapshot freshness is not active; use caution."
  }
}