Вся доска — одним вызовом инструмента
Каждое объявление об аренде в Дананге, сейчас их 11897, читается машиной: цены, районы, площади и ночные медианы рынка. Ни ключа, ни аккаунта, ни регистрации, ничего скрейпить не надо. Сверх бесплатного лимита вызывающая сторона платит за вызов стейблкоинами, без человека в цепочке.
Попробуйте прямо здесь
Кнопка делает настоящий MCP-вызов из вашего браузера к живому эндпоинту. Ничего не подставлено.
MCP
Один эндпоинт JSON-RPC без состояния. Он принимает initialize от клиентов, которые его присылают, и сессию держать не нужно.
https://helprentdanang.com/mcp/
Подключите HelpRent к Claude, ChatGPT, Cursor или любому MCP-клиенту. Агент ищет по всем объявлениям Дананга, сравнивает цены и районы и приносит вам ссылки.
Бесплатно каждый день в пределах лимита. Сверх него агент сам платит за вызовы в USDC (x402 в сетях Base, Solana, Arc или Stellar): без аккаунта, карты и ключа.
https://helprentdanang.com/mcp/
Добавить в Cursor Добавить в VS Code
Claude, ChatGPT и другие
- Claude: Настройки, Коннекторы, Добавить свой коннектор, вставьте адрес выше.
- ChatGPT: включите режим разработчика в настройках коннекторов, создайте коннектор, вставьте адрес выше.
- Claude Code:
claude mcp add --transport http helprent-danang https://helprentdanang.com/mcp/ - Любой другой клиент MCP по HTTP: адрес выше, ничего устанавливать не нужно.
Инструментов: 6, все только на чтение. search и fetch нужны коннекторам ChatGPT:
search_listings— Search long-term rental listings in Da Nang by city, district, type, bedrooms and price. Returns listing URLs; contact details are not included, send the person to the URL.get_listing— One listing in full, including its description.find_buildings— Apartment buildings with a manager, by district.market_stats— Median rents by size and district, the middle half of asking prices with the sample behind each figure, and how many listings are on the board. Recomputed nightly.search— Search long-term rentals in Da Nang from a plain phrase such as '2 bedroom apartment in Son Tra under 15 million'. Returns up to 10 results with id, title and url; pass an id to fetch for the full listing. Contact details are never included, send the person to the url.fetch— The full text of one listing by the id that search returned.
Инструментов записи нет. Ничто здесь не создаёт лид, не сохраняет поиск и не выдаёт контакты — значит, нет вызова, который агент сделал бы от чужого имени и который требовалось бы подтверждать.
Обычный HTTP
Те же данные, если не хочется говорить на MCP. Описание OpenAPI — последней строкой.
GET /api/v1/listings/— поиск и постраничный обход объявленийGET /api/v1/listings/<slug>/— одно объявление целикомGET /api/v1/buildings/— жилые комплексы с управляющимGET /api/v1/districts/— районы и сколько в каждомGET /api/v1/market/— медианные ставки, пересчёт каждую ночьGET /api/v1/openapi.json— описание всего перечисленного
Ограничения
100 вызовов в сутки с одного адреса, MCP и REST вместе; подключение и список инструментов по MCP не считаются. Этого хватает на ежедневный поиск агента: поиск и несколько объявлений — это 10–30 вызовов. Массовое чтение каталога — то, за что берётся оплата. Никого не блокируем.
Сверх лимита REST отвечает 402, а MCP отдаёт требование оплаты внутри результата инструмента, оба описаны ниже. Подключение и список инструментов по MCP в лимит не идут. В каждом ответе едет остаток бесплатной квоты, так что потолок не приходится нащупывать ударом:
X-RateLimit-Limit— суточная квотаX-RateLimit-Remaining— сколько от неё осталосьX-RateLimit-Reset— unix-время, когда она пополнится
Ответы отдаются с пятиминутным заголовком кэша. Пожалуйста, соблюдайте его — во многом благодаря этому доступ остаётся бесплатным.
Что в данных
Объявления собираются из публичных постов в Telegram, Facebook и Chợ Tốt, плюс от хостов, которые публикуются здесь напрямую. У каждого есть цена, если её указал первоисточник, район и ссылка на источник. Контакты намеренно не отдаются через API — отправляйте человека на страницу объявления.
Мы доска объявлений, а не посредник. Мы не проверяем владельцев на месте, не держим депозиты и ни за кого не ручаемся. Агент, передающий наши данные человеку, должен передать и это.
За пределами бесплатного лимита
Сверх суточного лимита эндпоинты отвечают 402 с платёжным запросом x402 вместо простого отказа. Оплатите — и тот же запрос пройдёт.
Это x402, платёжный протокол поверх HTTP 402, схема exact. Один запрос на оплату несёт по записи на каждую сеть в массиве accepts, USDC в сетях Base, Solana, Arc, Stellar, и ваш клиент выбирает ту цепь, на которой у него уже есть деньги. Три заголовка, все в виде JSON в base64:
PAYMENT-REQUIRED— наш 402 несёт этот заголовок: JSON в base64 с суммой, токеном и адресомPAYMENT-SIGNATURE— повторите запрос с этим заголовком: подписанная авторизация EIP-3009 на Base или Arc или частично подписанная транзакция на Solana В Stellar — транзакция с вашей подписанной записью авторизации Soroban.PAYMENT-RESPONSE— следующий за ним 200 возвращает вам хеш транзакции
Есть и платный адрес /api/v1/paid/listings/: тот же поиск без бесплатного лимита, поэтому до оплаты он всегда отвечает 402. Именно этот адрес предназначен для каталога x402 Bazaar от Coinbase. Купленные вызовы и токены кредита работают и там.
Через MCP
MCP следует транспорту x402 для MCP, а не кодам HTTP, поэтому обычный MCP-клиент получает результат инструмента, который может прочитать, а не обрыв связи. Сверх лимита tools/call возвращает isError с тем же требованием оплаты в structuredContent и в виде JSON-текста. Подпишите одну запись из accepts и повторите вызов с PaymentPayload в params._meta under the key x402/payment; ответ несёт чек в _meta under x402/payment-response. Оплата заголовком PAYMENT-SIGNATURE на /mcp/ тоже работает.
На Arc оплата идёт через наноплатежи Circle Gateway: один раз положите USDC в Gateway, затем подпишите авторизацию EIP-3009 для контракта GatewayWallet, указанного в записи, со сроком действия не меньше семи суток. На каждый вызов в сеть ничего не отправляется, а PAYMENT-RESPONSE возвращает идентификатор перевода Gateway вместо хеша транзакции.
На Stellar в записи указан контракт USDC (Stellar Asset Contract) как актив и сумма в его семи знаках после запятой. Подпишите Soroban authorization entry для transfer(from, payTo, amount) и пришлите транзакцию в payload; фасилитатор отправит её в сеть и заплатит комиссию, так что нужен USDC, а XLM не нужен.
Обратите внимание: в именах заголовков нет префикса X- — так было в первой версии, и клиент, написанный под неё, вообще не увидит нашего запроса на оплату.
One payment buys 5000 calls, not one — settling on chain per request would put a blockchain write between you and every listing you read.
Купленные вызовы зачисляются на адрес, с которого пришёл запрос, а оплаченный ответ ещё и выдаёт токен кредита: заголовок X-Credit-Token по HTTP или _meta с ключом com.helprentdanang/credit-token по MCP. Присылайте его обратно тем же способом, и остаток вызовов пойдёт за вами на любой адрес. Он показывается один раз и хранится только в виде хеша, так что сохраните его.
Каждый результат инструмента по MCP несёт ваше положение в _meta с ключом com.helprentdanang/allowance: сколько бесплатных вызовов осталось сегодня, сколько оплаченных и когда бесплатный лимит обнулится. Ближе к лимиту результат говорит об этом и словами, для модели.
Что мы принимаем
[
{
"scheme": "exact",
"network": "eip155:8453",
"amount": "10000",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"payTo": "0xf68bc1098469356eb57e70db9fed0bb524707132",
"maxTimeoutSeconds": 60,
"extra": {
"name": "USD Coin",
"version": "2"
}
},
{
"scheme": "exact",
"network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
"amount": "10000",
"asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"payTo": "6J7dpvZu4f3vYcRd3TY7dpjXZSYCRdLVfXkxtv3Ycz3j",
"maxTimeoutSeconds": 60,
"extra": {
"feePayer": "CjNFTjvBhbJJd2B5ePPMHRLx1ELZpa8dwQgGL727eKww"
}
},
{
"scheme": "exact",
"network": "eip155:5042",
"amount": "10000",
"asset": "0x3600000000000000000000000000000000000000",
"payTo": "0xf68bc1098469356eb57e70db9fed0bb524707132",
"maxTimeoutSeconds": 604900,
"extra": {
"name": "GatewayWalletBatched",
"version": "1",
"verifyingContract": "0x77777777dcc4d5a8b6e418fd04d8997ef11000ee"
}
},
{
"scheme": "exact",
"network": "stellar:pubnet",
"amount": "100000",
"asset": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75",
"payTo": "GB3XVWOCLA6XERF4AXOW5UV6Z534CGP2KFUPNYSXCNNVA57PWAMWYJP7",
"maxTimeoutSeconds": 60,
"extra": {
"areFeesSponsored": true
}
}
]Массив accepts в том виде, в каком его отдаёт 402: он собран той же функцией, поэтому страница не может отстать от самого запроса. Выберите одну запись и оплатите её; запроса достаточно, чтобы заплатить, не читая эту страницу.
Настоящий 402, от начала до конца
# 1. over the free line, no payment attached
curl -i https://helprentdanang.com/mcp/ \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
HTTP/2 402
payment-required: eyJ4NDAyVmVyc2lvbiI6MiwiZXJyb3IiOiJQQVlNRU5U...
cache-control: no-store
# 2. decode the header to see what is being asked for
echo '<that value>' | base64 -d | jq .
# 3. sign what your chosen entry describes (EIP-3009 on Base, a partially
# signed transaction on Solana, EIP-3009 for Circle Gateway on Arc,
# a Soroban authorization entry on Stellar), then repeat the SAME request
curl -i https://helprentdanang.com/mcp/ \
-H 'Content-Type: application/json' \
-H 'PAYMENT-SIGNATURE: <base64 of your PaymentPayload>' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
HTTP/2 200
payment-response: eyJzdWNjZXNzIjp0cnVlLCJ0cmFuc2FjdGlvbiI6IjB4...Только чтение, и это решение
Здесь нет ни одного пишущего инструмента и никогда не было. Ничто не создаёт лид, не сохраняет поиск, не отправляет сообщение и не тратит чужие деньги, поэтому на этом сервере нет вызова, который нужно подтверждать человеку. У каждого инструмента в аннотациях стоят readOnlyHint и destructiveHint — так ваш хост узнаёт это, не полагаясь на наши слова.
Контакты не отдаются никогда — ни телефон, ни ссылка на WhatsApp, ни адрес источника, который к ним приведёт, и внутри описания объявления тоже. Агент может прочитать о жилье всё и отправляет своего человека на нашу страницу, чтобы связаться с автором. Та страница ограничена по частоте, пишется в журнал и несёт предупреждение смотреть до оплаты; контакт, выданный через API, приходит без всего этого.
Сохранённый свободный текст считается недоверенным и на выходе: описание объявления — это пост, который написал незнакомый человек, и отдать его сырым значило бы стать доставщиком инъекции в вашего агента.