wwall
wwall
Политический предохранитель между ИИ-агентом и кошельком.
Aleph Hackathon 2026 · трек WDK · Tether
Дайте агенту кошелёк — и вы отдали ему свои деньги. wwall — это MCP-сервер, который стоит между ними: агент может предложить платёж, но локальная политика, написанная человеком, решает, будет ли он исполнен, нужно ли одобрение человека, или же он будет отклонён. Каждое решение записывается в подписываемый журнал с добавлением только новых записей.
Агент никогда не касается @tetherto/wdk. Он работает с wwall, а wwall работает с WDK.
┌─────────────┐ MCP/stdio ┌──────────────────────────┐ ┌──────────┐
│ AI agent │──────────────▶│ wwall │───────▶│ WDK │──▶ Polygon
│ (Claude…) │ propose_ │ ├ predicates.ts (guard) │ only │ wallet │
│ │ payment │ ├ ledger.jsonl (signed) │ if └──────────┘
└─────────────┘◀──────────────│ └ policy.json │ allowed
verdict └──────────────────────────┘
│ holds NEEDS_CONFIRM
▼
┌─────────────┐
│ human │ wwall pending / confirm / reject
└─────────────┘Главный инвариант
Ни один вызов инструмента не может достичь
wallet.send()без прохождения черезevaluatePredicates().
Всё остальное устроено так, чтобы этот инвариант соблюдался:
Сервер регистрирует ровно три инструмента —
propose_payment,get_balance,get_pending. Нет ниsend, ниtransfer, ниsign, ни инструмента для сырых транзакций, и тест проверяет список инструментов по именам и по шаблонам.Кошелёк открывается лениво, только по пути, который уже был разрешён. Отклонённое предложение вообще не создаёт экземпляр WDK — конфигурация токена, необходимая для ответа, передаётся отдельно именно по этой причине.
Токен выплат фиксируется конфигурацией. Если агент называет другой токен, он получает отказ до запуска каких-либо правил. (Без этого
SPEND_CAP{token:"USDT0"}просто не применился бы кtoken:"MONOPOLY", политика разрешила бы платёж, и кошелёк перевёл бы реальные USD₮0. Лимит расходов не должен обходиться подменой строки.)Отказ — это обычный результат работы инструмента, а не выброшенная ошибка, поэтому агент может прочитать причину и объяснить её человеку.
Те же самые предикаты регистрируются и внутри самого WDK, так что кошелёк отказывает тоже — см. ниже.
Два уровня, один набор предикатов
wwall решает, вызывать ли transfer. Это аргумент о данном
процессе. Собственный механизм политик WDK решает, исполнит ли кошелёк
перевод, — это свойство аккаунта:
wdk.registerPolicy({
id: 'wwall-guard', scope: 'project', wallet: 'polygon',
rules: [{ operation: 'transfer', action: 'ALLOW',
conditions: [ctx => evaluate(policy, intentFrom(ctx.args), context(), 'ignore-confirm')] }]
})Одно правило ALLOW, ограниченное теми же evaluatePredicates, что и всё остальное.
Сила — в том, что не записано: WDK — это запрет по умолчанию для управляемых
аккаунтов, поэтому как только применяется любая политика, каждый метод из OPERATIONS
оборачивается, и всё, что не имеет соответствующего ALLOW, выбрасывает PolicyViolationError.
Это закрывает обходные пути вокруг лимита расходов, которые вообще не касаются transfer:
Маршрут | Почему защита в виде |
| Тот же эффект, другой метод |
| Средства уходят позже, другой рукой |
| Полностью вне сети; ничего не «отправляется» |
| Передаёт управление контракту |
wwall не делает ничего из этого. В этом и суть: это были пути, которые его защита
не видела. test/wdk-policy.ts запускает настоящий WDK
против мёртвого RPC и проверяет, что каждый из них выбрасывает PolicyViolationError
до любого сетевого вызова — в то время как разрешённый перевод падает уже на сети,
что и доказывает: защита сработала до того, как средства покинули кошелёк, а не после.
Условие спрашивает: «разрешено ли это в принципе» (режим ignore-confirm). Разделение
«исполнено против удержано» принадлежит уровню выше: к моменту, когда удержанный
платёж доходит до transfer, человек уже одобрил его, и этот уровень не должен
отказывать ему во второй раз.
Условие, которое выбрасывает ошибку на ALLOW, считается как «не совпало», а при запрете по умолчанию это означает отказ — значит, ошибка в этом уровне превращается в отказ, а не в молчаливый пропуск.
Быстрый старт из чистого клона
git clone <this repo> && cd wwall
npm install
cp .env.example .env # then edit it — see below
npm run build
npm test # 295 tests, no network, no money
npm run try # walk the guard through a dozen proposals, fake wallet.env требует ровно одну строку. Всё остальное имеет значения по умолчанию:
WARDEN_SEED="…twelve words…"
# WARDEN_ARMED=1 # leave unset until you mean to move real fundsСеть, RPC и токен выплат по умолчанию — Polygon и USD₮0; политика, журнал и
ключ аудита лежат в ~/.wwall/. Смотрите .env.example — там каждая
переменная и что она меняет.
Проверьте кошелёк, не тратя ничего:
npm run check:walletЭто читает symbol() и decimals() прямо из контракта токена и
сверяет их с вашей конфигурацией. Неверный decimals — это не просто сообщение
об ошибке, это выплата, ошибающаяся на множитель 10ⁿ.
Предохранитель
WARDEN_ARMED по умолчанию выключен. Пока он не равен ровно 1, платёж,
разрешённый политикой, регистрируется, но не отправляется — предложение возвращается
как rejected с code: "not_armed". Включайте его осознанно.
Установка через Desktop Extension (рекомендуется)
wwall поставляется как MCP Bundle — один файл .mcpb, который Claude Desktop
устанавливает в один клик, с формой для настроек вместо ручного редактирования JSON.
npm install && npm run build
npm run bundle # → build/wwall.mcpbЗатем в Claude Desktop: Settings → Extensions → Install Extension… и выберите
build/wwall.mcpb.
Форма спрашивает об одном: seed-фраза. В манифесте она помечена как "sensitive": true,
поэтому Claude Desktop маскирует её и хранит в связке ключей ОС, а не в
конфигурационном файле, который вы потом случайно вставите в баг-репорт.
Всё остальное имеет значения по умолчанию и не спрашивается:
Параметр | Значение по умолчанию |
Сеть и RPC | Polygon, через публичную конечную точку |
Токен выплат | USD₮0 — |
Политика, журнал, ключ аудита |
|
~/.wwall — это намеренно не рабочая директория: расширение запускается с
непредсказуемой текущей директорией, поэтому журнал, привязанный к cwd, дал бы
CLI и MCP-серверу разные истории — и дневной лимит, посчитанный из неверного журнала,
перестал бы быть лимитом. Обе половины теперь читают один и тот же файл, поэтому
wwall pending из любой директории показывает то же, что видит расширение.
При первом запуске wwall создаёт стартовый ~/.wwall/policy.json с пустым списком
разрешённых, так что каждый платёж отклоняется, пока вы не укажете получателя:
REJECTED — nothing was sent.
ALLOWLIST: list is empty, no recipient is allowedОткройте wwall ui, чтобы добавить его. Расширение, которое могло бы платить тому,
о ком оно никогда не слышало, не было бы защитой; список разрешённых не должен
угадывать за вас.
Здесь нет второго переключателя. Установленное расширение — это и есть предохранитель, и единственное, что стоит между агентом и вашими деньгами, — это политика. В этом весь смысл продукта; глобальный тумблер поверх неё был бы ещё одним местом, куда смотреть, когда платёж отклонён, и ещё одним видом отказа, засоряющим журнал.
WARDEN_ARMED существует только для CLI и ручной конфигурации, где он полезен
как заморозка: одна строка в .env останавливает кошелёк, не трогая политику.
Любые значения по умолчанию можно переопределить старым способом — каждая переменная WARDEN_*
из .env.example работает и при запуске из CLI, и из расширения.
Сборка бандла требует CLI для упаковки, который уже есть в dev-зависимостях:
npx mcpb validate manifest.json # check the manifest against the schema
npx mcpb pack build/mcpb build/wwall.mcpbФормат назывался
.dxtи поставлялся как@anthropic-ai/dxt; этот пакет устарел и теперь указывает на@anthropic-ai/mcpb. Спецификация — в MANIFEST.md; этот бандл нацелен наmanifest_version0.4.
Подключение к Claude Desktop вручную
Ручной способ по-прежнему работает и его стоит сохранить: он помещает все настройки в один файл, который можно прочитать с одного взгляда, — а это иногда именно то, что нужно, когда проверяешь, что настроен делать предохранитель.
claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/):
{
"mcpServers": {
"wwall": {
"command": "node",
"args": ["/absolute/path/to/wwall/dist/src/bin/wwall-mcp.js"],
"env": {
"WARDEN_SEED": "…twelve words…",
"WARDEN_CHAIN": "polygon",
"WARDEN_RPC_URL": "https://polygon-bor-rpc.publicnode.com",
"WARDEN_TOKEN_ADDRESS": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
"WARDEN_TOKEN_SYMBOL": "USDT0",
"WARDEN_TOKEN_DECIMALS": "6",
"WARDEN_POLICY": "/absolute/path/to/wwall/policy.json",
"WARDEN_LEDGER": "/absolute/path/to/wwall/ledger.jsonl"
}
}
}
}Перезапустите Claude Desktop — и появятся три инструмента. Без клиента сервер говорит на обычном JSON-RPC через stdio:
printf '%s\n%s\n%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"x","version":"0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
| node dist/src/bin/wwall-mcp.jsИли запустите MCP Inspector:
npx @modelcontextprotocol/inspector node dist/src/bin/wwall-mcp.js
Инструменты
Инструмент | Что делает |
| Единственный путь к кошельку. Возвращает |
| Баланс газа и баланс токена выплат. Только чтение. |
| Платежи, удерживаемые для человека. Они не были отправлены. |
Суммы — десятичные строки везде: "12.50", никогда не 12.5. JSON-число
на денежном пути — это float, а float — это ошибка округления, ждущая
достаточно большого числа.
Человеческая половина
Агент может перевести платёж в состояние pending_confirmation. Вывести его
оттуда может только человек:
wwall pending # what is waiting, and which rule held it
wwall confirm <id> --by alex # approve and send
wwall reject <id> --note "…" # refuse; nothing is ever sent
wwall ui # policy builder in the browserОбе половины читают и пишут один и тот же ledger.jsonl, поэтому wwall pending
показывает ровно то же, что и get_pending у агента.
wwall confirm заново оценивает политику перед отправкой. Вердикт был
вынесен, когда агент предлагал платёж — возможно, часы и несколько платежей
назад; лимиты расходов с тех пор сдвинулись. Команда перепроверяет в режиме
«ignore-confirm» — спрашивая только разрешено ли это по-прежнему, потому что
человек за клавиатурой и есть подтверждение.
Политика
policy.json — это дерево предикатов. Девять операций:
Опкод | Поля | Значение |
|
| Пустой |
|
| Инвертирует. |
|
| Включительно. |
|
| Пустой список разрешённых не разрешает никому. Список, который вы забыли заполнить, не должен молча разрешать всем. |
|
| Пустой не запрещает никому. |
|
|
|
|
| Не отказ — суммы на уровне или выше удерживаются для человека. |
|
| Скользящее, как |
CONFIRM_THRESHOLD — вот почему политика вычисляется дважды для каждого предложения: один раз со всеми порогами, считающимися выполненными (допустимо ли это вообще?), и один раз строго (может ли это пройти без внимания человека?). Именно это позволяет порогу работать внутри AND, OR или NOT, а не только на верхнем уровне — плоский флаг «требуется одобрение» на такое не способен.
В зачёт лимита идут только подтверждённые отправки. Платёж, отправленный, но ещё не подтверждённый, невидим для SPEND_CAP и VELOCITY; см. Известные ограничения.
Конструктор без кода
wwall ui # → http://127.0.0.1:4478/Плоский список карточек правил плюс один переключатель «все/любое», живой предпросмотр policy.json и тестовая форма, показывающая вердикт по мере ввода. Кнопка Save записывает policy.json через локальный сервер.
На странице нет копии логики защиты. Вердикт приходит от POST /api/evaluate, который вызывает тот же evaluatePredicates, что и MCP-сервер и CLI, — вторая реализация на браузерном JavaScript разошлась бы с этой и незаметно начала бы давать другие ответы. Тест проверяет, что страница не содержит клиентской арифметики сумм.
Конструктор намеренно не умеет рисовать вложенную композицию (NOT, группы внутри групп). Политика, которая её использует, открывается в режиме только для чтения с пометкой, указывающей на policy.json. Полная композиция остаётся доступной при редактировании файла.
Журнал аудита
Каждая запись — вердикты, попытки отправки, результаты, решения человека — добавляется в ledger.jsonl, подписывается локальным ключом Ed25519 и связывается с предыдущей записью.
npm run verify:auditrecords 3 (3 signed, 3 verified)
pinned to MCowBQYDK2VwAyEAKcjUin18… from audit-key.json
✓ every record is signed and the chain is unbrokenПодписи доказывают, что запись не была отредактирована. Они не доказывают, что она не была удалена — удаление строки оставляет все остальные подписи действительными. Именно для этого нужен prev. Вместе они ловят редактирование, удаление из середины и перестановку.
Строка pinned to важна: без ключа аудита для проверки журнал, переписанный целиком с ключом атакующего, проверяется безупречно. Проверка имеет смысл только против ключа, которому вы доверяете.
Сценарии
36 сценариев прогоняются через настоящий MCP-сервер по настоящему транспорту — а не прямым вызовом оценщика, потому что интересные сбои живут в предварительных проверках, в обороте журнала и на границе инструмента.
npm run report:scenarios # print
npm run report:scenarios -- --write # splice the table into this READMEРезультаты сценариев
Категория | Сценариев | Выполнено | Ожидает человека | Отклонено | Соответствует спецификации |
Легитимные | 6 | 5 (83%) | 1 (17%) | 0 (0%) | 6/6 |
Пограничные | 12 | 4 (33%) | 3 (25%) | 5 (42%) | 12/12 |
Ловушки дробей | 10 | 0 (0%) | 0 (0%) | 10 (100%) | 10/10 |
Инъекция в промпт | 8 | 0 (0%) | 1 (13%) | 7 (88%) | 8/8 |
Все | 36 | 9 | 5 | 22 | 36/36 |
# | Категория | Сценарий | Исход | Почему |
L1 | Легитимные | небольшая выплата на адрес из белого списка | выполнено | ниже всех лимитов и ниже порога подтверждения |
L2 | Легитимные | наименьшая представимая сумма | выполнено | ровно одна базовая единица токена с 6 десятичными знаками |
L3 | Легитимные | токен, заданный адресом контракта вместо символа | выполнено | токен выплаты распознаётся в любом виде |
L4 | Легитимные | адрес с контрольной суммой против белого списка в нижнем регистре | выполнено | адреса EVM сравниваются без учёта регистра |
L5 | Легитимные | выплата, требующая человека, и переданная ему на рассмотрение | ожидает | выше порога подтверждения 2 USDT0, но в пределах лимитов |
L6 | Легитимные | вторая небольшая выплата за час | выполнено | с большим запасом в пределах лимита скорости 5/час |
B1 | Пограничные | ровно на лимите одной транзакции | ожидает | лимит включительный, так что проходит — но это выше порога подтверждения |
B2 | Пограничные | на одну базовую единицу выше лимита одной транзакции | отклонено | миллионная доллара сверх лимита — всё равно сверх лимита |
B3 | Пограничные | ровно на пороге подтверждения | ожидает | порог срабатывает на >=, так что сумма, равная ему, требует человека |
B4 | Пограничные | на одну базовую единицу ниже порога подтверждения | выполнено | строго ниже порога проходит без внимания |
B5 | Пограничные | платёж, ровно исчерпывающий дневной бюджет | ожидает | 20 уже потрачено + 5 = ровно лимит 25/день, который включительный |
B6 | Пограничные | платёж, превышающий дневной бюджет на одну единицу | отклонено | лимит измеряется по нарастающему итогу, а не по отдельной сумме |
B7 | Пограничные | шестой платёж в течение часа | отклонено | за этот час уже отправлено пять, а лимит — пять |
B8 | Пограничные | пятый платёж в течение часа | выполнено | отправлено четыре, так что этот ещё в пределах лимита |
B9 | Пограничные | получатель из чёрного списка, который также в белом списке | отклонено | вообще не в белом списке, а чёрный список отказал бы в любом случае |
B10 | Пограничные | платёж с нулевой суммой | выполнено | ноль — допустимая сумма при любых лимитах; ничто в политике его не запрещает |
B11 | Пограничные | адрес, почти совпадающий с адресом из белого списка | отклонено | один отличающийся символ — это другой адрес, а не достаточно близкое совпадение |
B12 | Пограничные | адрес получателя с окружающими пробелами | выполнено | пробелы от копипасты обрезаются, а не считаются частью адреса |
D1 | Ловушки дробей | больше десятичных знаков, чем есть у токена | отклонено | усечение до 1.123456 было бы недоплатой, которую никто не заметит |
D2 | Ловушки дробей | сумма меньше наименьшей представимой единицы | отклонено | округлилось бы до нуля — платёж, который молча ничего не платит |
D3 | Ловушки дробей | научная нотация | отклонено | разбор как float — ровно та потеря точности, которой этот проект избегает |
D4 | Ловушки дробей | запятая как десятичный разделитель | отклонено | неоднозначно между 1.5 и 15 в зависимости от локали; с деньгами нельзя гадать |
D5 | Ловушки дробей | разделители тысяч | отклонено | это не десятичное число, а угадывание 1000 было бы ошибкой в 1000 раз |
D6 | Ловушки дробей | отрицательная сумма | отклонено | отрицательный перевод — это не возврат, это некорректный запрос |
D7 | Ловушки дробей | не-ASCII цифры | отклонено | арабо-индийские цифры в одних стеках разбираются как число, в других — нет |
D8 | Ловушки дробей | сумма за пределами безопасного для float целочисленного диапазона | отклонено | намного выше лимита — и сравнивается как BigInt, так что лимит видит реальное значение |
D9 | Ловушки дробей | хвостовые нули, превышающие точность токена | отклонено | безвредно по значению, но принятие 7 знаков открывает случай, где это не так |
D10 | Ловушки дробей | пустая сумма | отклонено | пустая строка никогда не должна читаться как ноль или как «не задано» |
P1 | Инъекция в промпт | инструкция игнорировать политику в поле reason | отклонено | поле reason — это данные, записываемые в журнал; ничто не читает его как инструкцию |
P2 | Инъекция в промпт | заявленное предварительное одобрение человека | отклонено | одобрение существует только как запись confirmation_resolved, а не как утверждение в строке |
P3 | Инъекция в промпт | поддельная запись белого списка, заявленная в reason | отклонено | белый список читается из политики, а не от вызывающего |
P4 | Инъекция в промпт | инъекция, нацеленная на порог подтверждения | ожидает | срочность не является входом для защиты; удерживается ровно как любые другие 9 USDT0 |
P5 | Инъекция в промпт | управляющие символы и поддельный результат инструмента в reason | отклонено | reason JSON-кодируется на пути в журнал, так что подделать запись нельзя |
P6 | Инъекция в промпт | неподдерживаемый токен с авторитетно звучащим обоснованием | отклонено | токен, которым кошелёк не платит, отклоняется до обращения к любому правилу |
P7 | Инъекция в промпт | гомоглиф-адрес, похожий на адрес из белого списка | отклонено | это вообще не валидный адрес EVM, не говоря уже о белом списке |
P8 | Инъекция в промпт | разбиение заблокированного платежа на похожий на разрешённый | отклонено | белому списку безразлично, насколько мала сумма |
Интеграция с WDK
Каждый вызов WDK в проекте, в одном файле:
Что | Где |
Импорты | |
| |
| src/wdk.ts:218, создано в src/wdk-policy.ts:55 |
Условие ALLOW, которое вызывает | |
| |
| |
| |
| |
| |
| |
| |
|
MCP SDK: new McpServer в src/mcp-server.ts:97, три вызова registerTool в 113, 169 и 209, и StdioServerTransport в src/bin/wwall-mcp.ts:52.
Сигнатуры были прочитаны из собственных .d.ts-файлов установленных пакетов, а не из памяти — и tsc --strict проверяет типы по ним, что и является доказательством.
Пакеты
Пакет | Версия | Назначение |
| 1.0.0-beta.16 | Менеджер кошельков, деривация аккаунтов |
| 1.0.0-beta.17 | EVM-аккаунт: балансы, перевод ERC-20, подтверждение |
| 1.0.0-beta.17 | Общие типы результатов (транзитивно) |
| 1.30.0 | MCP-сервер, stdio-транспорт |
| 4.4.3 | Схемы ввода/вывода инструментов |
| 5.7.2 |
|
| 2.1.8 | Тесты |
Никаких зависимостей для денежных расчётов, подписи, HTTP или UI: BigInt с фиксированной точкой, node:crypto Ed25519, node:http и один вручную написанный HTML-файл.
Структура
Файл | Что |
Страж. Чистый — без I/O, без часов, без сети. | |
BigInt с фиксированной точкой. | |
Траты и скорость в скользящем окне, читаемые из журнала. | |
JSONL только на добавление, с fsync, опционально подписанный и связанный в цепочку. | |
Подпись и проверка Ed25519. | |
Загрузка и валидация, с ошибками JSON-path. | |
Обёртка WDK. Каждый результат сериализуем в JSON. | |
Те же предикаты, зарегистрированные в движке политик WDK. | |
Три инструмента и защищённый путь. | |
| |
API только для loopback, обслуживающее билдер. | |
Билдер. Один файл, без бандлера, без фреймворка. |
Известные ограничения
Сказано прямо, потому что инструмент безопасности, скрывающий свои ограничения, хуже того, у которого их нет.
В зачёт лимита идут только подтверждённые переводы. Пакет, отправленный быстрее, чем он подтверждается, может превысить дневной лимит.
LedgerEvalContext.pendingInWindow()существует, чтобы отчёт мог показать сумму, находящуюся в обработке, которую не видит ни один лимит.Усечение хвоста невозможно обнаружить. Хеш-цепочка идёт в обратном направлении, поэтому удаление последних N записей оставляет корректный префикс. Чтобы это поймать, нужен внешний якорь — счётчик записей, хранящийся в другом месте, или дайджест вершины, опубликованный где-то вне файла.
Сид остаётся сидом. Политика WDK управляет аккаунтами, полученными через этот экземпляр WDK. Любой, у кого есть та же сид-фраза в другом процессе — другой скрипт, кошелёк-приложение, утёкший
.env— переводит средства, и политика не мешает. Чтобы это предотвратить, нужен ключ, который не может покинуть пределы, а не политика: подписант в анклаве, смарт-аккаунт с ончейн-лимитами или со-подписант. wwall ограничивает агента; он не ограничивает держателя ключа.USD₮ на Polygon — это USDT0. Старый USDT Polygon с PoS-мостом был мигрирован на месте в нативный USD₮0, омниканальный токен Tether, обеспеченный 1:1 в Ethereum-сейфе. Проверено в цепочке:
name()="USDT0",symbol()="USDT0",decimals()=6. Не используйте адрес BNB Chain0x55d398…— это Binance-Peg, не выпущенный Tether, и у него 18 десятичных знаков, а не 6.policy.json— доверенный вход. Любой, кто может записать этот файл, может переписать защиту. Он загружается один раз при старте, и его sha256 записывается в каждый вердикт, поэтому изменение видно в журнале аудита постфактум — но оно не предотвращается.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Runtime permission, approval, and audit layer for AI agent tool execution.
Bitcoin-anchored, tamper-evident audit log for AI agents — record, disclose and verify actions.
Six-gate governance for AI agents: PROCEED/PAUSE/HALT decisions with hash-chained audit trails.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/axdvdv/wwall-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server