tamasPetki/HeadlessTracker

tamasPetki/HeadlessTracker

от tamaspetki
MCP сервер для агрегации крипто-портфеля: читает балансы бирж, кошельков и рынков предсказаний в режиме read-only. API-ключи хранятся локально и не передаются ИИ-хосту. Полезен инвесторам и трейдер...

headless-tracker

npm version

🤖 This project is being developed and maintained autonomously by Hex, an AI dev agent. Decisions log: decisions.md · Daily build log: daily-log.md · Hex on Bluesky · Solo team. No human in the dev loop.

⚠️ Not financial advice. HeadlessTracker is a portfolio data aggregation tool. For informational purposes only. See DISCLAIMER.md for full text.

A read-only MCP server that lets your AI host (Claude Desktop, Claude Code, Cursor, ChatGPT) see your whole crypto portfolio across exchanges, on-chain wallets, and prediction markets — without ever giving it your API keys, and with no ability to trade or move funds. It reads the numbers; it can't touch the money.

HeadlessTracker portfolio rendered as a dashboard by an AI host — net worth $116,166 across six venues (Bybit, Binance, MetaMask, Solana, Hyperliquid, Polymarket), with asset-class allocation, per-venue holdings, and open Hyperliquid perp positions shown as informational only.

↑ What your AI host renders from HeadlessTracker's data — one question, six venues, one view. The server returns the numbers; the host draws the picture. (Sample data; the visual is what a host renders on top of the tool output.)

npx headless-tracker demo — a sample six-venue portfolio (Bybit, Binance, MetaMask, Solana, Hyperliquid, Polymarket) rendered in the terminal with no accounts and no API keys

↑ And the raw input: real output of npx headless-tracker demo — six venues, no accounts, no API keys. Then ask your AI host about it.

add_custom_token

Добавляет специфичный для проекта ERC-20 токен в список отслеживаемых токенов аккаунта MetaMask. Встроенные популярные токены (USDC, USDT, WETH, WBTC, LINK, DAI) отслеживаются по умолчанию; этот инструмент предназначен для дополнительных токенов, таких как проектные / управляющие токены. Используйте, когда пользователь просит: «отслеживать токен ARB», «добавить UNI в мой кошелек», «мониторить кастомный ERC-20». Данные токена публичны в блокчейне (контракт + символ + десятичные знаки) — НИКАКИХ секретов, НИКАКОГО keychain не требуется. Входные параметры: - account_id: целевой аккаунт MetaMask (например, 'metamask:0xabc...') - chain_id: числовой (1=Ethereum, 137=Polygon, 56=BSC, 8453=Base, 42161=Arbitrum, 10=Optimism) - contract: адрес контракта с префиксом 0x (40 hex-символов) - symbol: от 1 до 20 символов - decimals: целое число от 0 до 36

Добавляет специфичный для проекта ERC-20 токен в список отслеживаемых токенов аккаунта MetaMask. Встроенные популярные токены (USDC, USDT, WETH, WBTC, LINK, DAI) отслеживаются по умолчанию; этот инструмент предназначен для дополнительных токенов, таких как проектные / управляющие токены. Используйте, когда пользователь просит: «отслеживать токен ARB», «добавить UNI в мой кошелек», «мониторить кастомный ERC-20». Данные токена публичны в блокчейне (контракт + символ + десятичные знаки) — НИКАКИХ секретов, НИКАКОГО keychain не требуется. Входные параметры: - account_id: целевой аккаунт MetaMask (например, 'metamask:0xabc...') - chain_id: числовой (1=Ethereum, 137=Polygon, 56=BSC, 8453=Base, 42161=Arbitrum, 10=Optimism) - contract: адрес контракта с префиксом 0x (40 hex-символов) - symbol: от 1 до 20 символов - decimals: целое число от 0 до 36

Параметры

  • account_idstringобязательный

    Target MetaMask account id (e.g. 'metamask:0xabc...').

  • chain_idintegerобязательный

    EVM chain id: 1=Ethereum, 137=Polygon, 56=BSC, 8453=Base, 42161=Arbitrum, 10=Optimism.

  • contractstringобязательный

    ERC-20 contract address: 0x-prefixed, 40 hex chars. Public on-chain data, no secret.

  • symbolstringобязательный

    Token ticker symbol, 1-20 chars (e.g. 'ARB').

  • decimalsintegerобязательный

    Token decimals (integer 0-36; most ERC-20s use 18, USDC/USDT use 6).

add_wallet_address

Добавляет дополнительный адрес кошелька к существующей учетной записи MetaMask или Solana. Используйте, когда пользователь просит: «добавить еще один кошелек», «отслеживать второй адрес», «добавить адрес MetaMask», «добавить адрес Solana». Новый адрес наследует настройки родительской учетной записи (ключ Etherscan + цепи для MetaMask; URL RPC для Solana). Адреса кошельков — публичные ончейн-идентификаторы — НОВЫЕ секреты не сохраняются. Просто обновляет поле `addresses[]` в записи связки ключей. Входные данные: - account_id: id существующей учетной записи (например, 'metamask:0xabc...' или 'solana:Abc...') - address: EVM-адрес с префиксом 0x и 40 шестнадцатеричными символами для учетных записей MetaMask, или base58 (32-44 символа) для учетных записей Solana

Добавляет дополнительный адрес кошелька к существующей учетной записи MetaMask или Solana. Используйте, когда пользователь просит: «добавить еще один кошелек», «отслеживать второй адрес», «добавить адрес MetaMask», «добавить адрес Solana». Новый адрес наследует настройки родительской учетной записи (ключ Etherscan + цепи для MetaMask; URL RPC для Solana). Адреса кошельков — публичные ончейн-идентификаторы — НОВЫЕ секреты не сохраняются. Просто обновляет поле `addresses[]` в записи связки ключей. Входные данные: - account_id: id существующей учетной записи (например, 'metamask:0xabc...' или 'solana:Abc...') - address: EVM-адрес с префиксом 0x и 40 шестнадцатеричными символами для учетных записей MetaMask, или base58 (32-44 символа) для учетных записей Solana

Параметры

  • account_idstringобязательный

    Id of the existing MetaMask or Solana account to add the address to (e.g. 'metamask:0xabc...' or 'solana:Abc...'). The new address inherits the parent's settings.

  • addressstringобязательный

    The wallet address to add: an EVM 0x-hex address (40 hex chars) for MetaMask accounts, or a base58 address (32-44 chars) for Solana accounts. Public on-chain identifier, no secret.

get_allocations

Возвращает разбивку распределения портфеля — текущую стоимость в долларах США, сгруппированную по выбранному измерению. Используйте это, когда пользователь спрашивает: «как распределён мой портфель», «разбивка по долям», «какой процент в крипте», «разбивка по сетям», «покажи мою крупнейшую позицию», «концентрация». Доступные группы: - 'asset_class' (по умолчанию): crypto / stock / prediction / cash (cash = стейблкоины типа USDC/USDT + фиат) - 'connector': bybit / metamask / polymarket - 'account': одна строка на каждый настроенный аккаунт - 'chain': сеть EVM (Ethereum / Polygon и т.д.) — имеет смысл только для активов в MetaMask - 'symbol': BTC / ETH / отдельный рынок — лучше всего подходит для анализа концентрации по топ-N Каждая строка группы содержит: label, currentValue (USD), percentOfTotal, holdingCount. Отсортированы по убыванию currentValue. Входные параметры: - by: какое измерение использовать для группировки (см. выше). По умолчанию 'asset_class'. - top: ограничить первыми N строками (например, top: 10 для крупнейших позиций). По умолчанию без ограничения. Возвращает только данные о позициях. Не является финансовой консультацией.

Возвращает разбивку распределения портфеля — текущую стоимость в долларах США, сгруппированную по выбранному измерению. Используйте это, когда пользователь спрашивает: «как распределён мой портфель», «разбивка по долям», «какой процент в крипте», «разбивка по сетям», «покажи мою крупнейшую позицию», «концентрация». Доступные группы: - 'asset_class' (по умолчанию): crypto / stock / prediction / cash (cash = стейблкоины типа USDC/USDT + фиат) - 'connector': bybit / metamask / polymarket - 'account': одна строка на каждый настроенный аккаунт - 'chain': сеть EVM (Ethereum / Polygon и т.д.) — имеет смысл только для активов в MetaMask - 'symbol': BTC / ETH / отдельный рынок — лучше всего подходит для анализа концентрации по топ-N Каждая строка группы содержит: label, currentValue (USD), percentOfTotal, holdingCount. Отсортированы по убыванию currentValue. Входные параметры: - by: какое измерение использовать для группировки (см. выше). По умолчанию 'asset_class'. - top: ограничить первыми N строками (например, top: 10 для крупнейших позиций). По умолчанию без ограничения. Возвращает только данные о позициях. Не является финансовой консультацией.

Параметры

  • byenum

    Dimension to group USD value by (default 'asset_class'). 'chain' is only meaningful for MetaMask holdings; 'symbol' is best for top-N concentration analysis.

    asset_classconnectoraccountchainsymbol
  • topinteger

    Limit to the top N rows by value (e.g. 10 for biggest positions). Omit for no limit.

get_holdings

Возвращает текущие портфельные активы по всем подключённым счетам. Используйте этот инструмент, когда пользователь спрашивает: «что у меня есть», «покажи мой портфель», «текущие позиции», «какой мой баланс», «покажи мои активы», «сколько у меня BTC», или хочет получить снимок позиций в криптовалюте/акциях/рынках прогнозов. Для вопросов, специфичных для Polymarket (какие рынки, исходы, статус разрешения или выкупа), предпочтительнее использовать get_polymarket_positions. Для ранжированного распределения / самых крупных позиций предпочтительнее использовать get_allocations. Каждый актив включает: символ, класс актива (crypto / stock / prediction / cash), количество, текущую цену, стоимость в USD и метаданные, специфичные для коннектора (например, chain для EVM, market title для Polymarket, accountType для Bybit). Входные параметры (все необязательные): - account_id: ограничиться одним счётом, например 'metamask:0xabc123...' или 'bybit:UNIFIED'. Опустите, чтобы запросить ВСЕ настроенные счета. - asset_class: ограничиться одним из 'crypto' / 'stock' / 'prediction' / 'cash'. 'prediction' = условные токены Polymarket; 'cash' = стейблкоины (USDC/USDT) + фиат. Опустите для всех классов. - currency: 'USD' | 'EUR' | 'GBP' | 'HUF'. По умолчанию 'USD'. Если установлено значение, отличное от USD, value/currentPrice/avgCost конвертируются по текущим курсам валют (бесплатное API + запасной вариант). Источник конвертации и время получения (fetchedAt) отображаются в `meta.fx`. Данные нижележащего коннектора не изменяются — это удобство на уровне отображения для пользователей, мыслящих в EUR/HUF/GBP. Результаты кэшируются для каждого коннектора (криптокошельки 60 с, биржи 120 с, Polymarket 30 с). Используйте инструмент 'refresh_data' сначала, если пользователь явно запрашивает свежие / последние данные. Возвращает только данные о позициях. Не является финансовой рекомендацией.

Возвращает текущие портфельные активы по всем подключённым счетам. Используйте этот инструмент, когда пользователь спрашивает: «что у меня есть», «покажи мой портфель», «текущие позиции», «какой мой баланс», «покажи мои активы», «сколько у меня BTC», или хочет получить снимок позиций в криптовалюте/акциях/рынках прогнозов. Для вопросов, специфичных для Polymarket (какие рынки, исходы, статус разрешения или выкупа), предпочтительнее использовать get_polymarket_positions. Для ранжированного распределения / самых крупных позиций предпочтительнее использовать get_allocations. Каждый актив включает: символ, класс актива (crypto / stock / prediction / cash), количество, текущую цену, стоимость в USD и метаданные, специфичные для коннектора (например, chain для EVM, market title для Polymarket, accountType для Bybit). Входные параметры (все необязательные): - account_id: ограничиться одним счётом, например 'metamask:0xabc123...' или 'bybit:UNIFIED'. Опустите, чтобы запросить ВСЕ настроенные счета. - asset_class: ограничиться одним из 'crypto' / 'stock' / 'prediction' / 'cash'. 'prediction' = условные токены Polymarket; 'cash' = стейблкоины (USDC/USDT) + фиат. Опустите для всех классов. - currency: 'USD' | 'EUR' | 'GBP' | 'HUF'. По умолчанию 'USD'. Если установлено значение, отличное от USD, value/currentPrice/avgCost конвертируются по текущим курсам валют (бесплатное API + запасной вариант). Источник конвертации и время получения (fetchedAt) отображаются в `meta.fx`. Данные нижележащего коннектора не изменяются — это удобство на уровне отображения для пользователей, мыслящих в EUR/HUF/GBP. Результаты кэшируются для каждого коннектора (криптокошельки 60 с, биржи 120 с, Polymarket 30 с). Используйте инструмент 'refresh_data' сначала, если пользователь явно запрашивает свежие / последние данные. Возвращает только данные о позициях. Не является финансовой рекомендацией.

Параметры

  • account_idstring

    Scope to one account by id, e.g. 'metamask:0xabc123...' or 'bybit:UNIFIED'. Omit to query ALL configured accounts. Get valid ids from list_accounts.

  • asset_classenum

    Scope to one asset class. 'prediction' = Polymarket conditional tokens; 'cash' = stablecoin/fiat balances. Omit for all classes.

    cryptostockpredictioncash
  • currencyenum

    Display currency for value/currentPrice/avgCost (default 'USD'). Non-USD converts via live FX; the rate and source appear in meta.fx. Display-only — underlying data is unchanged.

    USDEURGBPHUF
get_pnl

Возвращает агрегированную прибыль/убыток по всем настроенным счетам. Используйте этот инструмент, когда пользователь спрашивает: «как у меня дела», «какая у меня прибыль/убыток», «я в плюсе или минусе», «покажи прибыль», «покажи убытки» или запрашивает любую сводку по портфелю. Возвращаемые поля по каждому счету и по итогу: - currentValue (USD) — текущая стоимость портфеля - costBasis (USD) — сумма avgCost * количество (там, где коннектор это отслеживает) - unrealizedPnl (USD) — currentValue - costBasis (для ещё открытых позиций) - realizedPnl (USD) — уже закрытая P&L из метаданных коннектора - notes — оговорки по каждому коннектору (например, MetaMask не отслеживает стоимость) Входные параметры (необязательные): - account_id: ограничиться одним счётом. - timeframe: '24h' | '7d' | '30d' | 'ytd' | 'all'. Если установлено значение, отличное от 'all', результат включает блок `windowDelta`, вычисленный на основе исторических цен CoinGecko. ПРЕДУПРЕЖДЕНИЕ О ПРИБЛИЗИТЕЛЬНОСТИ: он оценивает вашу ТЕКУЩУЮ корзину по историческим ценам по сравнению с текущими — он НЕ учитывает сделки внутри окна. Сообщите об этом пользователю честно. Позиции Polymarket и токены без привязки к CoinGecko пропускаются (учитываются в `skippedSymbols`). Исторические данные бесплатного уровня CoinGecko имеют дневную детализацию, поэтому '24h' = «вчерашнее закрытие». - include_history (boolean, по умолчанию false): также извлекает транзакции и запускает по ним реестр стоимости, возвращая `realizedFromHistory` по каждому счету + итог. Требует дополнительного обхода для каждого счёта, но даёт честную реализованную прибыль/убыток по токенам, рождённым в цепочке (награды LP, свопы, нативные аирдропы). Токены, пришедшие через перевод в кошелёк (без цены), получают `unknownSalesCount`, а не завышенный knownRealized — явная честность в отношении того, какую стоимость мы знаем. ПОЛИМАРКЕТ-СПЕЦИФИЧНО: когда include_history=true, realizedPnl для счёта Polymarket заменяется числом, полученным из стоимости сделок. В режиме по умолчанию realizedPnl для Polymarket остаётся null, потому что cashPnl коннектора смешивает реализованную + нереализованную…

Возвращает агрегированную прибыль/убыток по всем настроенным счетам. Используйте этот инструмент, когда пользователь спрашивает: «как у меня дела», «какая у меня прибыль/убыток», «я в плюсе или минусе», «покажи прибыль», «покажи убытки» или запрашивает любую сводку по портфелю. Возвращаемые поля по каждому счету и по итогу: - currentValue (USD) — текущая стоимость портфеля - costBasis (USD) — сумма avgCost * количество (там, где коннектор это отслеживает) - unrealizedPnl (USD) — currentValue - costBasis (для ещё открытых позиций) - realizedPnl (USD) — уже закрытая P&L из метаданных коннектора - notes — оговорки по каждому коннектору (например, MetaMask не отслеживает стоимость) Входные параметры (необязательные): - account_id: ограничиться одним счётом. - timeframe: '24h' | '7d' | '30d' | 'ytd' | 'all'. Если установлено значение, отличное от 'all', результат включает блок `windowDelta`, вычисленный на основе исторических цен CoinGecko. ПРЕДУПРЕЖДЕНИЕ О ПРИБЛИЗИТЕЛЬНОСТИ: он оценивает вашу ТЕКУЩУЮ корзину по историческим ценам по сравнению с текущими — он НЕ учитывает сделки внутри окна. Сообщите об этом пользователю честно. Позиции Polymarket и токены без привязки к CoinGecko пропускаются (учитываются в `skippedSymbols`). Исторические данные бесплатного уровня CoinGecko имеют дневную детализацию, поэтому '24h' = «вчерашнее закрытие». - include_history (boolean, по умолчанию false): также извлекает транзакции и запускает по ним реестр стоимости, возвращая `realizedFromHistory` по каждому счету + итог. Требует дополнительного обхода для каждого счёта, но даёт честную реализованную прибыль/убыток по токенам, рождённым в цепочке (награды LP, свопы, нативные аирдропы). Токены, пришедшие через перевод в кошелёк (без цены), получают `unknownSalesCount`, а не завышенный knownRealized — явная честность в отношении того, какую стоимость мы знаем. ПОЛИМАРКЕТ-СПЕЦИФИЧНО: когда include_history=true, realizedPnl для счёта Polymarket заменяется числом, полученным из стоимости сделок. В режиме по умолчанию realizedPnl для Polymarket остаётся null, потому что cashPnl коннектора смешивает реализованную + нереализованную…

Параметры

  • account_idstring

    Scope to one account (e.g. 'bybit:UNIFIED'). Omit for P&L across all accounts.

  • timeframeenum

    Default 'all'. Any non-'all' value adds a windowDelta block (current basket valued at historical vs current CoinGecko prices). APPROXIMATION: it does NOT account for trades within the window; surface that caveat. Daily granularity, so '24h' = since yesterday's close.

    24h7d30dytdall
  • include_historyboolean

    Default false. When true, also fetches transactions and runs a cost-basis ledger for honest realizedFromHistory per account (one extra round-trip each). Required to get Polymarket's real realized P&L (null otherwise).

  • methodenum

    Cost-basis method when include_history=true (default 'fifo'). Use 'average' if the user says 'average/avg/weighted cost'. No effect when include_history=false.

    fifoaverage
  • currencyenum

    Display currency for all numeric fields (default 'USD'). Non-USD converts via live FX; source/rate appear in meta.fx. Use for currency-consistent dashboards.

    USDEURGBPHUF
get_polymarket_positions

Возвращает позиции на рынке предсказаний Polymarket, сгруппированные по событиям, когда это возможно. Используйте этот инструмент, когда пользователь спрашивает о своих ставках на Polymarket конкретно: 'show my Polymarket positions', 'how am I doing on Polymarket', 'what bets do I have', 'show my prediction market positions', 'election bets', 'sports bets' и т.д. Для общих запросов о портфеле, которые упоминают Polymarket вместе с криптовалютами/акциями, используйте get_holdings (с необязательным фильтром asset_class='prediction'). Каждая позиция включает: - market title (понятный человеку вопрос, например 'Will X win the 2024 election?') - outcome ('Yes' / 'No' / имя конкретного кандидата) - quantity (условные токены, каждый стоимостью от 0 до 1 USDC) - currentPrice (от 0 до 1, текущая подразумеваемая вероятность рынка) - currentValue (в USD), avgCost (USD за токен), cashPnl (реализованная + нереализованная прибыль/убыток) - redeemable (true, если рынок разрешён и вы можете получить выплату) - mergeable (true, если вы можете объединить токены Yes+No для гарантированного получения USDC) - endDate (когда рынок разрешается) Входные параметры (необязательные): - account_id: ограничивает одним аккаунтом Polymarket (если у вас их несколько). - group_by_event: 'true' (по умолчанию) группирует исходы Yes+No для одного рынка; 'false' возвращает одну строку на актив. - resolved_only: 'true' возвращает только позиции, доступные для получения (рынки, которые разрешились). По умолчанию 'false' возвращает всё. Возвращает только данные о позициях. Не является финансовой консультацией.

Возвращает позиции на рынке предсказаний Polymarket, сгруппированные по событиям, когда это возможно. Используйте этот инструмент, когда пользователь спрашивает о своих ставках на Polymarket конкретно: 'show my Polymarket positions', 'how am I doing on Polymarket', 'what bets do I have', 'show my prediction market positions', 'election bets', 'sports bets' и т.д. Для общих запросов о портфеле, которые упоминают Polymarket вместе с криптовалютами/акциями, используйте get_holdings (с необязательным фильтром asset_class='prediction'). Каждая позиция включает: - market title (понятный человеку вопрос, например 'Will X win the 2024 election?') - outcome ('Yes' / 'No' / имя конкретного кандидата) - quantity (условные токены, каждый стоимостью от 0 до 1 USDC) - currentPrice (от 0 до 1, текущая подразумеваемая вероятность рынка) - currentValue (в USD), avgCost (USD за токен), cashPnl (реализованная + нереализованная прибыль/убыток) - redeemable (true, если рынок разрешён и вы можете получить выплату) - mergeable (true, если вы можете объединить токены Yes+No для гарантированного получения USDC) - endDate (когда рынок разрешается) Входные параметры (необязательные): - account_id: ограничивает одним аккаунтом Polymarket (если у вас их несколько). - group_by_event: 'true' (по умолчанию) группирует исходы Yes+No для одного рынка; 'false' возвращает одну строку на актив. - resolved_only: 'true' возвращает только позиции, доступные для получения (рынки, которые разрешились). По умолчанию 'false' возвращает всё. Возвращает только данные о позициях. Не является финансовой консультацией.

Параметры

  • account_idstring

    Scope to one Polymarket account if several are configured. Omit for all.

  • group_by_eventboolean

    Default true: groups Yes+No outcomes of the same market into one event row. Set false for one row per asset/outcome.

  • resolved_onlyboolean

    Default false (return all positions). Set true to return only redeemable positions in markets that have already resolved.

get_transactions

Возвращает историю транзакций (торги, депозиты, выводы, комиссии, переводы токенов ERC-20) по настроенным аккаунтам. Используйте это, когда пользователь спрашивает: «какие торги я совершал», «покажи мои транзакции», «история транзакций», «недавние покупки», «недавние продажи», «покажи мои депозиты», «когда я купил X», «что я делал на этой неделе» и т.д. Каждая транзакция включает: - type: trade / buy / sell / deposit / withdraw / fee / interest / reward / transfer / resolve - symbol, quantity, price (за единицу на момент транзакции) - fee + feeCurrency - timestamp (ISO 8601) - metadata (специфичные для коннектора: chain, hash, market и т.д.) Входные параметры (опционально): - account_id: ограничить одним аккаунтом. - since: сокращение ('24h', '7d', '30d', '90d') ИЛИ время в эпохальных миллисекундах (например, 1700000000000). По умолчанию: примерно последние 50 транзакций по каждому аккаунту независимо от даты. Ограничения покрытия (V0): - Bybit: полный журнал транзакций - MetaMask: переводы нативных цепочек + переводы токенов ERC-20 (USDC, USDT и т.д.) - Polymarket: торги BUY/SELL из эндпоинта /trades (до ~1000 последних). Возвращает только данные транзакций. Не является финансовой консультацией.

Возвращает историю транзакций (торги, депозиты, выводы, комиссии, переводы токенов ERC-20) по настроенным аккаунтам. Используйте это, когда пользователь спрашивает: «какие торги я совершал», «покажи мои транзакции», «история транзакций», «недавние покупки», «недавние продажи», «покажи мои депозиты», «когда я купил X», «что я делал на этой неделе» и т.д. Каждая транзакция включает: - type: trade / buy / sell / deposit / withdraw / fee / interest / reward / transfer / resolve - symbol, quantity, price (за единицу на момент транзакции) - fee + feeCurrency - timestamp (ISO 8601) - metadata (специфичные для коннектора: chain, hash, market и т.д.) Входные параметры (опционально): - account_id: ограничить одним аккаунтом. - since: сокращение ('24h', '7d', '30d', '90d') ИЛИ время в эпохальных миллисекундах (например, 1700000000000). По умолчанию: примерно последние 50 транзакций по каждому аккаунту независимо от даты. Ограничения покрытия (V0): - Bybit: полный журнал транзакций - MetaMask: переводы нативных цепочек + переводы токенов ERC-20 (USDC, USDT и т.д.) - Polymarket: торги BUY/SELL из эндпоинта /trades (до ~1000 последних). Возвращает только данные транзакций. Не является финансовой консультацией.

Параметры

  • account_idstring

    Scope to one account (e.g. 'metamask:0xabc...'). Omit for all accounts.

  • sincestring

    Lower time bound: shorthand ('24h', '7d', '30d', '90d') or epoch milliseconds as a string (e.g. '1700000000000'). Omit for roughly the last 50 transactions per account regardless of date.

list_accounts

Выводит список настроенных аккаунтов PORTFOLIO TRACKER (Bybit exchange / Binance exchange / MetaMask wallets / Polymarket / Solana wallets / Hyperliquid) без раскрытия учётных данных. Используйте, когда пользователь спрашивает: «какие аккаунты трекера настроены», «покажи мои портфельные аккаунты», «список моих подключений к биржам», «какие криптобиржи подключены», «какие кошельки я отслеживаю», «какие адреса я отслеживаю». Возвращает: id, connectorId (bybit | binance | metamask | polymarket | solana | hyperliquid), label, createdAt и специфичные для коннектора публичные метаданные (например, chainIds и addresses для MetaMask, accountType для Bybit, address для Solana/Hyperliquid, key fingerprint для Binance). Учётные данные НИКОГДА не возвращаются — они остаются в системной связке ключей. НЕ вызывайте этот инструмент, когда пользователь имеет в виду: учётные записи email, социальных сетей, GitHub, облачных сервисов, системных пользователей ОС или любые другие «аккаунты» из другой предметной области или MCP-сервера. Это именно подключения к биржам/кошелькам headless-tracker.

Выводит список настроенных аккаунтов PORTFOLIO TRACKER (Bybit exchange / Binance exchange / MetaMask wallets / Polymarket / Solana wallets / Hyperliquid) без раскрытия учётных данных. Используйте, когда пользователь спрашивает: «какие аккаунты трекера настроены», «покажи мои портфельные аккаунты», «список моих подключений к биржам», «какие криптобиржи подключены», «какие кошельки я отслеживаю», «какие адреса я отслеживаю». Возвращает: id, connectorId (bybit | binance | metamask | polymarket | solana | hyperliquid), label, createdAt и специфичные для коннектора публичные метаданные (например, chainIds и addresses для MetaMask, accountType для Bybit, address для Solana/Hyperliquid, key fingerprint для Binance). Учётные данные НИКОГДА не возвращаются — они остаются в системной связке ключей. НЕ вызывайте этот инструмент, когда пользователь имеет в виду: учётные записи email, социальных сетей, GitHub, облачных сервисов, системных пользователей ОС или любые другие «аккаунты» из другой предметной области или MCP-сервера. Это именно подключения к биржам/кошелькам headless-tracker.

Параметры

  • connectorenum

    Filter to accounts of one connector. Omit to list every configured account.

    bybitbinancemetamaskpolymarketsolanahyperliquid
list_custom_tokens

Перечисляет пользовательские ERC-20 токены, отслеживаемые аккаунтами MetaMask. Публичные данные; секретной информации нет. Используйте, когда пользователь спрашивает: 'какие пользовательские токены я отслеживаю', 'показать мои проектные токены'. Входные данные (необязательно): account_id для фильтрации по одному аккаунту.

Перечисляет пользовательские ERC-20 токены, отслеживаемые аккаунтами MetaMask. Публичные данные; секретной информации нет. Используйте, когда пользователь спрашивает: 'какие пользовательские токены я отслеживаю', 'показать мои проектные токены'. Входные данные (необязательно): account_id для фильтрации по одному аккаунту.

Параметры

  • account_idstring

    Filter to one MetaMask account id. Omit to list custom tokens across all accounts.

refresh_data

Инвалидирует кэш PORTFOLIO TRACKER (активы и транзакции Bybit/Binance/MetaMask/Polymarket/Solana/Hyperliquid) и принудительно выполняет новый запрос к вышестоящим API при следующем вызове. Используйте это, когда пользователь просит: «обновить портфель», «обновить мои активы», «получить последние цены портфеля», «загрузить свежие данные портфеля», «проверить текущие курсы криптовалют», «мои балансы устарели», «принудительно обновить», «мои данные устарели» или подразумевает, что требуется актуальность в реальном времени ДЛЯ ТРЕКЕРА. Опционально можно ограничить область действия одним коннектором (bybit, binance, metamask, polymarket, solana, hyperliquid). Без области действия инвалидирует всё, что связано с трекером. НЕ вызывайте этот инструмент, если пользователь имеет в виду: обновление веб-страницы, обновление OAuth-токена, обновление кэша браузера, обновление данных с MCP-сервера, не связанного с трекером. Он инвалидирует только SQLite-кэш headless-tracker. После вызова воспользуйтесь get_holdings или другим инструментом для данных, чтобы фактически получить свежие данные — refresh_data только помечает кэш как устаревший, сам по себе не запускает получение данных.

Инвалидирует кэш PORTFOLIO TRACKER (активы и транзакции Bybit/Binance/MetaMask/Polymarket/Solana/Hyperliquid) и принудительно выполняет новый запрос к вышестоящим API при следующем вызове. Используйте это, когда пользователь просит: «обновить портфель», «обновить мои активы», «получить последние цены портфеля», «загрузить свежие данные портфеля», «проверить текущие курсы криптовалют», «мои балансы устарели», «принудительно обновить», «мои данные устарели» или подразумевает, что требуется актуальность в реальном времени ДЛЯ ТРЕКЕРА. Опционально можно ограничить область действия одним коннектором (bybit, binance, metamask, polymarket, solana, hyperliquid). Без области действия инвалидирует всё, что связано с трекером. НЕ вызывайте этот инструмент, если пользователь имеет в виду: обновление веб-страницы, обновление OAuth-токена, обновление кэша браузера, обновление данных с MCP-сервера, не связанного с трекером. Он инвалидирует только SQLite-кэш headless-tracker. После вызова воспользуйтесь get_holdings или другим инструментом для данных, чтобы фактически получить свежие данные — refresh_data только помечает кэш как устаревший, сам по себе не запускает получение данных.

Параметры

  • connectorenum

    Scope the cache invalidation to one connector. Omit to invalidate every tracker connector's cached holdings and transactions.

    bybitbinancemetamaskpolymarketsolanahyperliquid
remove_account

Удаляет аккаунт из AccountStore И его учётные данные из системной связки ключей ОС. ОДНОСТОРОННЯЯ операция. Интерфейс Settings требует явного подтверждения пользователя перед вызовом. Используйте, когда пользователь запрашивает: 'remove the Bybit account', 'отключить Polymarket', 'забыть этот кошелек'. Входные данные: - account_id: id аккаунта для удаления (например, 'bybit:UNIFIED', 'metamask:0xabc...'). Возвращает: ok, removedAccountId; или ошибку, если аккаунт не найден.

Удаляет аккаунт из AccountStore И его учётные данные из системной связки ключей ОС. ОДНОСТОРОННЯЯ операция. Интерфейс Settings требует явного подтверждения пользователя перед вызовом. Используйте, когда пользователь запрашивает: 'remove the Bybit account', 'отключить Polymarket', 'забыть этот кошелек'. Входные данные: - account_id: id аккаунта для удаления (например, 'bybit:UNIFIED', 'metamask:0xabc...'). Возвращает: ok, removedAccountId; или ошибку, если аккаунт не найден.

Параметры

  • account_idstringобязательный

    Id of the account to delete (e.g. 'bybit:UNIFIED', 'metamask:0xabc...'). ONE-WAY: removes the account and its keychain credentials. Confirm with the user first.

remove_custom_token

Удаляет пользовательский ERC-20 токен из списка отслеживаемых токенов аккаунта MetaMask. Использует публичные данные on-chain, без взаимодействия с хранилищем ключей. Применяется, когда пользователь просит: «перестать отслеживать ARB», «удалить этот токен из MetaMask», «отписаться от токена проекта». Входные данные: - account_id: целевой аккаунт MetaMask (например, 'metamask:0xabc...') - chain_id: числовой ID сети (1=Ethereum, 137=Polygon, 56=BSC, 8453=Base, 42161=Arbitrum, 10=Optimism) - contract: адрес контракта с префиксом 0x (40 hex-символов) Возвращает ok или ошибку not_found, если токен не отслеживался для этого аккаунта и сети.

Удаляет пользовательский ERC-20 токен из списка отслеживаемых токенов аккаунта MetaMask. Использует публичные данные on-chain, без взаимодействия с хранилищем ключей. Применяется, когда пользователь просит: «перестать отслеживать ARB», «удалить этот токен из MetaMask», «отписаться от токена проекта». Входные данные: - account_id: целевой аккаунт MetaMask (например, 'metamask:0xabc...') - chain_id: числовой ID сети (1=Ethereum, 137=Polygon, 56=BSC, 8453=Base, 42161=Arbitrum, 10=Optimism) - contract: адрес контракта с префиксом 0x (40 hex-символов) Возвращает ok или ошибку not_found, если токен не отслеживался для этого аккаунта и сети.

Параметры

  • account_idstringобязательный

    Target MetaMask account id (e.g. 'metamask:0xabc...').

  • chain_idintegerобязательный

    EVM chain id the token is tracked on: 1=Ethereum, 137=Polygon, 56=BSC, 8453=Base, 42161=Arbitrum, 10=Optimism.

  • contractstringобязательный

    ERC-20 contract address to untrack: 0x-prefixed, 40 hex chars.

render_dashboard

Отображает интерактивную панель PORTFOLIO TRACKER в виде MCP-приложения (живая UI-панель): для криптоактивов, P&L, рынков предсказаний, ончейн-кошельков. Используйте этот инструмент, когда пользователь просит: 'show my portfolio dashboard', 'open my dashboard', 'render the portfolio panel' или хочет получить живую интерактивную сводку активов / еженедельный обзор портфеля / аудит рисков. Три вкладки (Portfolio / Weekly / Risk) с переключателем валюты (USD/EUR/GBP/HUF) и кнопкой обновления. iframe самостоятельно вызывает инструменты (get_holdings / get_pnl / get_allocations / get_transactions / get_polymarket_positions / refresh_data), когда пользователь нажимает на вкладки или кнопку обновления. После открытия дополнительные запросы от вас не требуются. Если хост не отображает MCP-приложения, инструмент всё равно возвращает текстовое подтверждение, но пользователь не увидит живого интерфейса. НЕ вызывайте этот инструмент, когда пользователь имеет в виду другой тип панели (деплои Vercel, ошибки Sentry, метрики Grafana, активность на GitHub, события аналитики и т.д.). Это панель портфеля headless-tracker. Если запрос неоднозначен, попросите пользователя уточнить, какую именно панель он имеет в виду. Входные параметры (оба необязательны): - currency: 'USD' | 'EUR' | 'GBP' | 'HUF'. Начальная валюта отображения. Пользователь может переключать в режиме реального времени. - tab: 'portfolio' | 'weekly' | 'risk'. Начальная активная вкладка. Пользователь может переключать в режиме реального времени.

Portfolio Dashboard

Отображает интерактивную панель PORTFOLIO TRACKER в виде MCP-приложения (живая UI-панель): для криптоактивов, P&L, рынков предсказаний, ончейн-кошельков. Используйте этот инструмент, когда пользователь просит: 'show my portfolio dashboard', 'open my dashboard', 'render the portfolio panel' или хочет получить живую интерактивную сводку активов / еженедельный обзор портфеля / аудит рисков. Три вкладки (Portfolio / Weekly / Risk) с переключателем валюты (USD/EUR/GBP/HUF) и кнопкой обновления. iframe самостоятельно вызывает инструменты (get_holdings / get_pnl / get_allocations / get_transactions / get_polymarket_positions / refresh_data), когда пользователь нажимает на вкладки или кнопку обновления. После открытия дополнительные запросы от вас не требуются. Если хост не отображает MCP-приложения, инструмент всё равно возвращает текстовое подтверждение, но пользователь не увидит живого интерфейса. НЕ вызывайте этот инструмент, когда пользователь имеет в виду другой тип панели (деплои Vercel, ошибки Sentry, метрики Grafana, активность на GitHub, события аналитики и т.д.). Это панель портфеля headless-tracker. Если запрос неоднозначен, попросите пользователя уточнить, какую именно панель он имеет в виду. Входные параметры (оба необязательны): - currency: 'USD' | 'EUR' | 'GBP' | 'HUF'. Начальная валюта отображения. Пользователь может переключать в режиме реального времени. - tab: 'portfolio' | 'weekly' | 'risk'. Начальная активная вкладка. Пользователь может переключать в режиме реального времени.

Параметры

  • currencyenum

    Initial display currency for the dashboard (default 'USD'). The user can switch it live in the panel.

    USDEURGBPHUF
  • tabenum

    Initial active tab (default 'portfolio'). The user can switch tabs live in the panel.

    portfolioweeklyrisk
render_settings

Отображает панель настроек PORTFOLIO TRACKER в виде приложения MCP (интерактивная UI-панель) — графическая альтернатива настройке через CLI для headless-tracker (подключения Bybit / MetaMask / Polymarket). Используйте, когда пользователь просит: 'открой мои настройки портфеля', 'добавь аккаунт Bybit', 'подключи мой кошелёк MetaMask к трекеру', 'покажи мои аккаунты трекера', 'удали это подключение к бирже', 'добавь пользовательский ERC-20 токен', 'добавь ещё один адрес кошелька для отслеживания'. Четыре вкладки: - Accounts: список настроенных аккаунтов трекера только для чтения с кнопками Remove (диалог подтверждения без возможности отмены). - Add Account: формы для Bybit / MetaMask / Polymarket с явным уведомлением о безопасности. - Wallets: добавление дополнительного адреса кошелька к существующему аккаунту трекера MetaMask. - Custom Tokens: список + добавление/удаление ERC-20 токенов по цепочкам. НЕ вызывайте этот инструмент, когда пользователь имеет в виду: настройки приложения (Claude Desktop / VS Code / браузер), системные параметры, настройки ОС, настройки аккаунта на сайтах, настройки профиля, настройки уведомлений, тему/внешний вид или любые другие настройки UI из другого MCP-сервера. Это именно панель настройки портфельного трекера headless-tracker. Если запрос неоднозначный (просто 'открой настройки'), уточните, какие настройки. ПОВЕДЕНЧЕСКИЙ КОНТРАКТ ДЛЯ ВАС (LLM): Если пользователь вставляет учётные данные прямо в чат, направляйте его к этому интерфейсу настроек, а не вызывайте setup_connector со встроенными значениями — форма не допускает секреты в текст диалога. После того как пользователь воспользуется формой, результат работы инструмента — косметическое подтверждение; НЕ повторяйте и не перефразируйте любые учётные данные, которые могут появиться в диалоге. Входные параметры (необязательные): - tab: 'accounts' | 'add-account' | 'wallets' | 'tokens' — начальная активная вкладка.

Settings

Отображает панель настроек PORTFOLIO TRACKER в виде приложения MCP (интерактивная UI-панель) — графическая альтернатива настройке через CLI для headless-tracker (подключения Bybit / MetaMask / Polymarket). Используйте, когда пользователь просит: 'открой мои настройки портфеля', 'добавь аккаунт Bybit', 'подключи мой кошелёк MetaMask к трекеру', 'покажи мои аккаунты трекера', 'удали это подключение к бирже', 'добавь пользовательский ERC-20 токен', 'добавь ещё один адрес кошелька для отслеживания'. Четыре вкладки: - Accounts: список настроенных аккаунтов трекера только для чтения с кнопками Remove (диалог подтверждения без возможности отмены). - Add Account: формы для Bybit / MetaMask / Polymarket с явным уведомлением о безопасности. - Wallets: добавление дополнительного адреса кошелька к существующему аккаунту трекера MetaMask. - Custom Tokens: список + добавление/удаление ERC-20 токенов по цепочкам. НЕ вызывайте этот инструмент, когда пользователь имеет в виду: настройки приложения (Claude Desktop / VS Code / браузер), системные параметры, настройки ОС, настройки аккаунта на сайтах, настройки профиля, настройки уведомлений, тему/внешний вид или любые другие настройки UI из другого MCP-сервера. Это именно панель настройки портфельного трекера headless-tracker. Если запрос неоднозначный (просто 'открой настройки'), уточните, какие настройки. ПОВЕДЕНЧЕСКИЙ КОНТРАКТ ДЛЯ ВАС (LLM): Если пользователь вставляет учётные данные прямо в чат, направляйте его к этому интерфейсу настроек, а не вызывайте setup_connector со встроенными значениями — форма не допускает секреты в текст диалога. После того как пользователь воспользуется формой, результат работы инструмента — косметическое подтверждение; НЕ повторяйте и не перефразируйте любые учётные данные, которые могут появиться в диалоге. Входные параметры (необязательные): - tab: 'accounts' | 'add-account' | 'wallets' | 'tokens' — начальная активная вкладка.

Параметры

  • tabenum

    Initial active tab (default 'accounts'). The user can switch tabs live in the panel.

    accountsadd-accountwalletstokens
setup_connector

Создаёт новую учётную запись, записывая учетные данные ТОЛЬКО ДЛЯ ЧТЕНИЯ в системную связку ключей. Используйте, когда пользователь запрашивает: 'добавить аккаунт Bybit', 'подключить Binance', 'подключить мой кошелёк MetaMask', 'настроить Polymarket', 'подключить мой кошелёк Solana', 'отслеживать мой Hyperliquid', 'добавить мой кошелёк Hyperliquid', 'добавить новую биржу'. КОНТРАКТ ПОВЕДЕНИЯ ДЛЯ ВАС (LLM): - После успешного выполнения этого инструмента подтвердите пользователю ТОЛЬКО метку учётной записи и account_id. - НИКОГДА не повторяйте, не записывайте, не перефразируйте и не воспроизводите значения учётных данных (apiKey, apiSecret, etherscanApiKey) в своём ответе. - Если пользователь вставляет учётные данные прямо в чат, предложите ему использовать форму в интерфейсе настроек (инструмент render_settings) — форма не включает секреты в историю переписки. Учётные данные проверяются через вышестоящее API перед сохранением; при неудачной проверке ничего не записывается. Хранилище: системная связка ключей (macOS Keychain / Linux Secret Service / Windows Credential Vault) через @napi-rs/keyring. Тот же путь, что и в процессе настройки через CLI. Все шесть коннекторов по замыслу используют учётные данные ТОЛЬКО ДЛЯ ЧТЕНИЯ (Bybit только 'Read', Binance только 'Enable Reading', Etherscan — это токен с ограничением частоты для публичных данных, прокси-кошелёк Polymarket уже публичный, адреса Solana/Hyperliquid — это публичные ончейн-идентификаторы — Hyperliquid вообще не требует ключа или подписи). Входные данные (требуется один из bybit / binance / metamask / polymarket / solana / hyperliquid): - bybit: { apiKey, apiSecret, accountType: 'UNIFIED'|'CONTRACT'|'SPOT'|'FUND' (основной, он же ID учётной записи), accountTypes?: массив дополнительных типов для распределения (например, ['FUND'] вместе с UNIFIED, чтобы отслеживались балансы фондового кошелька) } - binance: { apiKey, apiSecret, includeFutures (необязательный bool, по умолчанию false), recvWindow (необязательный ms) } - metamask: { address, etherscanApiKey, chainIds (number[]), trackCommonTokens (bool), hasEtherscanPro (bool) } - polymarket: { proxyWallet (0x...), sizeThreshold…

Создаёт новую учётную запись, записывая учетные данные ТОЛЬКО ДЛЯ ЧТЕНИЯ в системную связку ключей. Используйте, когда пользователь запрашивает: 'добавить аккаунт Bybit', 'подключить Binance', 'подключить мой кошелёк MetaMask', 'настроить Polymarket', 'подключить мой кошелёк Solana', 'отслеживать мой Hyperliquid', 'добавить мой кошелёк Hyperliquid', 'добавить новую биржу'. КОНТРАКТ ПОВЕДЕНИЯ ДЛЯ ВАС (LLM): - После успешного выполнения этого инструмента подтвердите пользователю ТОЛЬКО метку учётной записи и account_id. - НИКОГДА не повторяйте, не записывайте, не перефразируйте и не воспроизводите значения учётных данных (apiKey, apiSecret, etherscanApiKey) в своём ответе. - Если пользователь вставляет учётные данные прямо в чат, предложите ему использовать форму в интерфейсе настроек (инструмент render_settings) — форма не включает секреты в историю переписки. Учётные данные проверяются через вышестоящее API перед сохранением; при неудачной проверке ничего не записывается. Хранилище: системная связка ключей (macOS Keychain / Linux Secret Service / Windows Credential Vault) через @napi-rs/keyring. Тот же путь, что и в процессе настройки через CLI. Все шесть коннекторов по замыслу используют учётные данные ТОЛЬКО ДЛЯ ЧТЕНИЯ (Bybit только 'Read', Binance только 'Enable Reading', Etherscan — это токен с ограничением частоты для публичных данных, прокси-кошелёк Polymarket уже публичный, адреса Solana/Hyperliquid — это публичные ончейн-идентификаторы — Hyperliquid вообще не требует ключа или подписи). Входные данные (требуется один из bybit / binance / metamask / polymarket / solana / hyperliquid): - bybit: { apiKey, apiSecret, accountType: 'UNIFIED'|'CONTRACT'|'SPOT'|'FUND' (основной, он же ID учётной записи), accountTypes?: массив дополнительных типов для распределения (например, ['FUND'] вместе с UNIFIED, чтобы отслеживались балансы фондового кошелька) } - binance: { apiKey, apiSecret, includeFutures (необязательный bool, по умолчанию false), recvWindow (необязательный ms) } - metamask: { address, etherscanApiKey, chainIds (number[]), trackCommonTokens (bool), hasEtherscanPro (bool) } - polymarket: { proxyWallet (0x...), sizeThreshold…

Параметры

  • connectorenumобязательный

    Which connector to set up. Provide the matching credential object below (e.g. connector='bybit' requires the 'bybit' object). All credentials are READ-ONLY by design.

    bybitbinancemetamaskpolymarketsolanahyperliquid
  • bybitobject

    Bybit credentials (required when connector='bybit'). Read-only API key/secret + account type.

  • binanceobject

    Binance credentials (required when connector='binance'). Read-only API key/secret.

  • metamaskobject

    MetaMask/EVM config (required when connector='metamask'). Public address + Etherscan rate-limit key + chains.

  • polymarketobject

    Polymarket config (required when connector='polymarket'). Public proxy wallet address; no secret.

  • solanaobject

    Solana config (required when connector='solana'). Public base58 address; no secret.

  • hyperliquidobject

    Hyperliquid config (required when connector='hyperliquid'). Public EVM address; no key or signature.

Другие проверенные MCP-сервера

apify/mcp-server-rag-web-browser

apify/mcp-server-rag-web-browser

официальный

MCP сервер подключает AI агентов к вебу через RAG Web Browser Actor. Выполняет поиск в Google, извлекает страницы и возвращает чистый Markdown. Идеально для RAG пайплайнов и LLM, которым нужны свежие данные из интернета.

JavaScript208
esignaturescom/mcp-server-esignatures

esignaturescom/mcp-server-esignatures

официальный

MCP сервер eSignatures.com: создание и редактирование Markdown-контрактов, управление подписантами и шаблонами. Полезен разработчикам и AI-агентам для гибких workflows электронных подписей.

Python38
21st-dev/Magic-MCP

21st-dev/Magic-MCP

MCP сервер 21st.dev Magic AI Agent помогает разработчикам создавать UI-компоненты через описание на естественном языке. Интегрируется с Cursor, Windsurf и VS Code, генерируя готовые компоненты.

TypeScript5468
IvanMurzak/Unity-MCP

IvanMurzak/Unity-MCP

MCP сервер связывает AI-агентов с Unity, автоматизируя создание сцен, генерацию кода и отладку. Работает внутри собранной игры — для динамических NPC и дебага. Полезен геймдев-разработчикам.

C#3597
GreptimeTeam/greptimedb-mcp-server

GreptimeTeam/greptimedb-mcp-server

официальный

GreptimeDB MCP-сервер для AI-ассистентов - выполняет SQL, TQL и RANGE-запросы к open-source базе наблюдаемости, объединяющей метрики, логи и трейсы. Встроенная безопасность: read-only, маскировка д...

Python28
Azure/azure-mcp

Azure/azure-mcp

официальный

MCP-сервер для Azure, упрощающий подключение ИИ-агентов к облачным ресурсам. Разработчики используют его для безопасного доступа к данным и автоматизации операций. Интеграция с Azure AI и службами через единый протокол.

C#1226
© Каталог MCP, 2026. Все права защищены.
Проект не аффилирован с Anthropic и любыми упомянутыми продуктами.
Все названия и торговые марки принадлежат их владельцам.
Контакты для связи: hi@mcp-katalog.ru

Лука Никитин