Skip to main content
Glama
oase-mcp

oase-mcp

Official
by oase-app

oase-mcp

MCP-сервер, который позволяет Claude общаться внутри Oase. Дайте Claude ссылку-приглашение, и он сможет публиковать сообщения в групповом чате этого oase, публиковать посты (opslag) в ленту oase, читать переписку и реагировать — удобно для статусных обновлений, сообщений «Я закончил X» или заметок там, где вы их увидите.

Это REST-клиент: каждый инструмент — это обычный HTTP-вызов запроса/ответа.

📖 Документация: https://dev.oase.app/mcp/

Статус / отказ от ответственности

Это экспериментальный проект, предоставляемый как есть. Он основан на внутреннем API Oase, который может меняться без предупреждения, — поэтому проект может сломаться, измениться или быть прекращён в любой момент, и нет гарантии, что он работает сегодня или продолжит работать завтра. Поддержка не гарантируется: issue приветствуются (см. SUPPORT.md), но могут остаться без ответа. Если вам нужен поддерживаемый путь интеграции, используйте вместо этого интеграцию identity & SCIM.

Общается с продакшен-бэкендом Oase (api.oase.app) точно так же, как это делает приложение: вход → присоединение по ссылке-приглашению → получение ключа oase из KMS → шифрование AES-256-GCM → POST .../messaging/messages. Сообщения шифруются на стороне клиента симметричным ключом AES-256-GCM oase (полученным из KMS через подтверждение, подписанное mainframe), поэтому в приложении они отображаются нормально.

Related MCP server: OpenClaw MCP Server

Архитектура

Кодовая база — это пассивный REST-клиент с MCP-сервером поверх:

  • Пассивный REST-клиент — src/client/. Всё, что знает, как общаться с Oase по HTTP: вход/аутентификация Promise (promiseLogin.ts), обновление токена и общий файл конфигурации (config.ts), а также полный REST-клиент (oaseClient.ts) — присоединение по ссылке-приглашению, получение ключа из KMS, шифрование/дешифрование AES-256-GCM, отправка и чтение сообщений и постов ленты, реакции и медиа. Никакого поведения агента, никакой зависимости от MCP: он что-то делает, только когда его вызывают. Его могут импортировать другие потребители через корень пакета или oase-mcp/client (import { OaseClient, loadConfig } from "oase-mcp"), без подключения MCP-слоя.

  • MCP-сервер — src/mcp/. Слой MCP-инструментов поверх REST-клиента (server.ts). Каждый инструмент — это обёртка запроса/ответа по требованию. Точка входа: dist/index.js (claude mcp add oase -- node /path/to/dist/index.js).

Как это работает

  • Идентичность. Claude входит как постоянный пользователь Promise (провайдера идентичности, который использует приложение Oase) через одноразовый вход в браузере — см. Вход в систему. Полученный долгоживущий refresh-токен Oase хранится в ~/.oase-mcp/config.json (режим 0600); кратковременные access-токены хранятся в памяти и обновляются автоматически.

  • Шифрование. Oase шифрует содержимое сообщений симметричным ключом AES-256-GCM для каждого oase, который хранится в эскроу на бэкенде. Любой участник может получить исходный ключ oase из KMS через подтверждение, подписанное mainframe, так что шифрование/дешифрование не представляет сложности — никаких пар ключей устройства или регистрации. Мы создаём точно такую же форму cipher-bundle, которую ожидает приложение.

  • Ни одно сообщение не отправляется открытым текстом — endpoint отправки требует cipher bundle.

Установка

npm install
npm run build

Зарегистрируйте его в Claude Code (укажите абсолютный путь к этому каталогу):

claude mcp add oase -- node /path/to/oase-mcp/dist/index.js

Или добавьте в конфигурацию MCP-клиента вручную:

{
  "mcpServers": {
    "oase": {
      "command": "node",
      "args": ["/path/to/oase-mcp/dist/index.js"]
    }
  }
}

Вход в систему

Claude входит как постоянный пользователь Promise — это одноразовая настройка:

  1. Вызовите promise_login_start — он вернёт URL. Откройте его в браузере (лучше всего в режиме инкогнито, чтобы не использовалась существующая сессия Promise).

  2. Войдите в (или создайте) учётную запись Promise для Claude. На странице будет написано «Token captured».

  3. Вызовите promise_login_finish — он обменяет токен на постоянную идентичность Oase.

Под капотом сервер запускает OIDC-callback на localhost и перехватывает одноразовый id_token из редиректа — без копирования и вставки. (Если у вас уже есть id_token, login_with_promise принимает его напрямую.)

В результате обмена возвращается собственный долгоживущий refresh-токен Oase (привязанный к Promise person_id), поэтому Promise больше никогда не запрашивается — никакие учётные данные Promise не сохраняются, только полученный refresh-токен Oase.

Вход обязателен: все остальные инструменты (join, send, read, ask) отказываются работать, пока не установлена идентичность Promise.

Инструменты

Инструмент

Аргументы

Что делает

promise_login_start

—

Запускает одноразовый вход в браузере для постоянной идентичности Promise; возвращает URL для открытия.

promise_login_finish

—

Завершает вход в Promise после авторизации в браузере.

login_with_promise

id_token

Обменивает уже имеющийся у вас Promise id_token.

join_oase

invite_link, display_name?

Присоединяется к oase по ссылке-приглашению (https://oase.app/oase/<id>/join/<phrase>). Устанавливает отображаемое имя (по умолчанию Claude) и делает этот oase целевым по умолчанию.

send_message

message, oase_id?, thread_id?

Публикует сообщение в формате Markdown. С thread_id публикует внутри ветки ответов на это сообщение; в противном случае — в основной чат.

update_message

message_id, message, oase_id?

Редактирует текст отправленного вами сообщения (только своего). Вложения сохраняются; меняется только текст.

delete_message

message_id, oase_id?

Удаляет сообщение (мягкое удаление). Своё или чужое, если вы админ/владелец oase.

send_post

body, title?, oase_id?

Публикует пост (opslag) в ленту/на стену oase — элементы главной страницы приложения, отдельные от чата. Тело в Markdown, опциональный заголовок (отображается как заголовок). Комментарии к посту — это ответы в ветке: send_message с thread_id=<post id>. Возвращает ошибку posting_restricted, если админ ограничил публикацию только для админов.

update_post

post_id, body, title?, oase_id?

Редактирует тело поста в ленте (и, при желании, заголовок; опустите title, чтобы сохранить его). Свой пост или чужой, если вы админ/владелец oase.

delete_post

post_id, oase_id?

Удаляет пост из ленты. Свой или чужой, если вы админ/владелец oase.

read_posts

oase_id?, limit?

Читает недавние посты ленты (расшифрованные), сначала старые; каждая строка начинается с id поста и помечена (you)/(them), с тегами заголовка и вложений. Вложения постов доступны через read_media.

react_to_message

message_id, reaction, oase_id?

Добавляет эмодзи-реакцию к сообщению (по одной на участника на сообщение).

read_media

message_id, media_index?, oase_id?

Скачивает и расшифровывает вложение сообщения (изображение, голосовое сообщение / звуковой фрагмент, файл). Изображения возвращаются инлайн, чтобы агент мог их просматривать и анализировать; каждое вложение также сохраняется в локальный временный файл, путь к которому возвращается (например, для расшифровки аудио).

read_messages

oase_id?, limit?

Читает недавние сообщения (расшифрованные), сначала старые; каждая строка начинается с id сообщения и помечена (you)/(them); ответы помечаются (in thread <rootId>). Вложения отображаются как теги [attachment <n>: <mime> "<name>"] — получайте их через read_media.

list_oases

—

Показывает идентичность Claude в Oase и oase, к которым он присоединился.

set_name

display_name, oase_id?

Изменяет отображаемое имя, под которым Claude публикует сообщения.

Ветки и ответы

Ветки в Oase одноуровневые: каждый ответ на сообщение находится под resource id этого сообщения (chat_id <oaseId>/m/<messageId>), и нельзя ответить на ответ — вложенная ветка никогда бы не отображалась в приложении. Сервер обеспечивает это: thread_id, указывающий на ответ, автоматически преобразуется в корневое сообщение ветки, так что ничто никогда не попадает в невидимый вложенный чат. Чтобы ответить на сообщение, передайте его id как thread_id в send_message; используйте read_messages, чтобы ознакомиться с контекстом и получить нужные id.

Вложения (изображения, голосовые сообщения, файлы)

Сообщения с вложениями показывают их как теги [attachment <n>: <mime> "<name>"] в каждом результате чтения (голосовое сообщение — это просто вложение audio/*, обычно audio/mp4). read_media скачивает blob и для современных загрузок расшифровывает его: приложение загружает медиа как зашифрованный контейнер .oase — [4-byte length][metadata JSON {alg, kid, oaseId, ivBase64}] [ciphertext][16-byte GCM tag] — зашифрованный тем же oase-ключом, что и текст (сервер хранит его в эскроу), а исходные имя файла/mime передаются как cipher-пакеты в элементе медиа (legacy-вложения — это открытые blob'ы за подписанными CDN-URL, которые проходят без изменений; вложения giphy резолвятся через свой зашифрованный giphy-объект).

Что агент получает в ответ:

  • Изображения (jpeg/png/gif/webp до 3 МБ) возвращаются инлайн как image-контент MCP, так что агент может смотреть на них напрямую и использовать увиденное в своём ответе. Более крупные изображения откатываются к сохранённому файлу.

  • Всё также записывается в <tmpdir>/oase-mcp/media/<messageId>-<n>-<name>, и возвращается путь. Для аудио (Claude не умеет слушать нативно) агенту предлагается транскрибировать сохранённый файл локальным инструментом распознавания речи (например, hear на macOS или whisper) и работать с транскриптом; документы можно открывать обычными файловыми инструментами.

URL-адреса загрузки blob подписаны провайдером и истекают через ~2 дня; read_media обновляет проекцию чата и повторяет попытку один раз, если URL устарел. Голосовые сообщения / сообщения только с медиа имеют пустое текстовое тело и показываются через read_messages так же, как любое другое сообщение.

Типовой сценарий

  1. Авторизуйте Claude: promise_login_start → откройте URL → promise_login_finish.

  2. В приложении Oase откройте свою oase → invite → скопируйте ссылку для вступления.

  3. Попросите Claude: "Вступите в эту oase: https://oase.app/oase/…/join/…" → join_oase.

  4. Попросите Claude "отправить сообщение в oase с текстом …" → send_message, "опубликовать обновление в ленте" → send_post или "что нового в oase?" → read_messages / read_posts.

Конфигурация

Переменные окружения (все опциональны):

  • OASE_MCP_CONFIG_DIR — где хранить config.json (по умолчанию ~/.oase-mcp).

  • OASE_API_ROOT — корень API mainframe (по умолчанию https://api.oase.app), например, для указания на staging.

  • OASE_KMS_ROOT — корень KMS (по умолчанию https://kms.oase.app/, завершающий слэш обязателен).

Примечания и ограничения

  • Работает с групповым чатом oase (и с ветками ответов к отдельным сообщениям) и с записями в ленте oase (send_post/read_posts — только текст при отправке; заголовок и тело записи — это отдельные cipher-пакеты под тем же oase-ключом). Может читать/расшифровывать медиавложения (read_media), но не отправлять их; не обрабатывает приватные чаты 1:1 или процессы одобрения вступления в realm.

  • Ответы не могут быть вложенными — ветки имеют глубину в один уровень. thread_id, который сам является ответом, молча резолвится в корневое сообщение ветки (best effort: для сообщения старше последней страницы чата id используется как есть).

  • Вход под другой учётной записью Promise очищает список присоединённых oase, поскольку членства привязаны к человеку — после этого пригласите Claude заново.

  • Удаление ~/.oase-mcp/config.json стирает личность (Claude должен войти и быть приглашённым заново).

  • Многие серверные процессы (по одному на сессию Claude) используют общую личность из ~/.oase-mcp/config.json. Бэкенд ротирует refresh-токен при каждом oauth2/refresh и удаляет сессию, если когда-либо видит устаревший токен (анти-повтор) — поэтому access-токен сохраняется для повторного использования, а обновления сериализуются между процессами через ~/.oase-mcp/auth.lock с повторным чтением под локом. Не вызывайте oauth2/refresh out-of-band, пока серверы работают; если сессия всё же будет отозвана, инструменты сообщат об этом — войдите снова через promise_login_start.

Лицензия

MIT — см. LICENSE.

Available Tools

16 tools
delete_messageDelete a messageA

Delete a chat message (soft delete — it shows as removed in the app). Get the message_id from send_message or read_messages output. Omit oase_id to use the default (last joined) oase. You can delete your own messages; deleting someone else's requires being an oase admin/owner, otherwise the backend rejects it.

NameRequiredDescriptionDefault
oase_idNoTarget oase id. Defaults to the last joined oase.
message_idYesId of the message to delete.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses soft delete behavior, default oase selection, and permission requirements. It also mentions the backend rejection scenario, which is a helpful behavioral detail. It doesn't cover all possible side effects, but it's more than adequate for this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences, front-loaded with the main action and soft-delete note, followed by parameter sourcing and permission guidance. No fluff or redundancy; every sentence provides essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 2 parameters (1 required) and no output schema, the description covers the key aspects: how to get the message, the default oase behavior, and permission constraints. It doesn't mention the response format, but that's not critical given the simplicity. It's reasonably complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so parameters are documented. The description adds value beyond the schema by explaining where message_id comes from and that omitting oase_id defaults to the last joined oase, which is not in the schema. This enriches the parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Delete a chat message') and the specific behavior (soft delete). It distinguishes from sibling tools like update_message and delete_post by indicating it's for messages, and it specifies the resource type. The verb and resource are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit context on how to obtain the message_id ('from send_message or read_messages output') and explains the default behavior of oase_id. It also gives clear conditions for successful execution (own messages vs. requiring admin/owner). It doesn't explicitly mention alternatives, but the context is sufficient for correct usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_postDelete a feed postA

Delete a post (opslag) from an oase's feed. Get the post_id from send_post or read_posts output. Omit oase_id to use the default (last joined) oase. You can delete your own post; deleting someone else's requires being an oase admin/owner, otherwise the backend rejects it.

NameRequiredDescriptionDefault
oase_idNoTarget oase id. Defaults to the last joined oase.
post_idYesId of the post to delete.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses the permission requirement (own post or admin/owner, else backend rejects) and the default oase_id behavior. It does not mention irreversible deletion or cascading effects, but these are generally implied by 'delete'. The disclosed rejection condition is valuable and goes beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the primary action, and includes necessary details (post_id source, oase_id default, permission constraint) without any fluff. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete tool with 2 parameters, no output schema, and no annotations, the description covers all necessary aspects: what it does, how to identify the target, default oase behavior, and permission constraints. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for both parameters, but the description adds extra meaning: how to obtain post_id (from send_post/read_posts) and the default behavior for oase_id. This enhances the agent's understanding beyond the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Delete'), the resource ('a post (opslag)'), and the context ('from an oase's feed'). It also names the source of the post_id (send_post or read_posts output), which immediately distinguishes it from sibling tools like delete_message (messages vs posts) and update_post (modification vs deletion). Nothing is vague or tautological.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context on when to use the tool: when you have a post_id (from send_post/read_posts) and you either own the post or are an oase admin/owner, otherwise the backend rejects it. It also explains the default behavior for oase_id. It does not explicitly name alternatives, but the conditions for deletion are unambiguous, and the purpose is distinct from siblings like update_post.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

join_oaseJoin an OaseA

Join an oase using an invite link (e.g. https://oase.app/oase//join/). Requires being logged in as a Promise user first (promise_login_start/finish). Sets your display name and makes this oase the default target for send_message.

NameRequiredDescriptionDefault
invite_linkYesThe full Oase invite link, or '<oase_id> <phrase>'.
display_nameNoName to show in the oase. Defaults to 'Claude'.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosure. It discloses the authentication requirement, that it sets the display name, and that it makes this oase the default target for send_message. These are important side effects. It does not mention failure behavior or reversibility, but for a join operation this is reasonably transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences with no unnecessary words. It front-loads the core action, then lists the prerequisite, and then the side effects. Every sentence adds value and there is no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a join tool: it explains the prerequisite, the side effects (setting display name and default target), and gives an example URL. It lacks details on error handling or return value, but given the absence of an output schema and the simplicity of the operation, the key information is present. It could mention what happens if the invite link is invalid, but that is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%—both parameters have clear descriptions in the schema. The description adds minimal extra meaning beyond restating that it sets display name, which is already in the parameter description. It also mentions the invite link format in the description, but that's also covered in the schema. Baseline 3 is appropriate since the schema already explains the parameters well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action: joining an oase via an invite link, with an explicit URL example. It also distinguishes itself from siblings by noting it is different from sending messages or other operations, and it specifies that it sets the default target for send_message, which is a unique behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear prerequisite: the user must be logged in as a Promise user first, referencing the specific login tools (promise_login_start/finish). This tells the agent when to use the tool (after login) and what the alternative actions are for authentication. It does not explicitly mention when not to use it, but the purpose is distinct enough from siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_oasesList joined OasesA

Show this agent's Oase identity and the oases it has joined.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility for behavioral disclosure. The description implies a read-only operation by using 'show', but it does not explicitly state side effects, authentication requirements, or any error conditions. It also does not describe the format or detail of the returned data, which could be important for an agent. This is a modest disclosure for a simple read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that front-loads the core functionality. Every word adds value, and there is no redundant information. It is efficient and memorable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (no parameters, no output schema), the description covers the essential information: what the tool does and what it returns. It does not specify details like pagination, ordering, or the exact structure of the identity object, but given the lack of an output schema, these are not strictly required. The description is complete enough for an agent to understand the tool's purpose and invoke it without ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the schema is an empty object. The description does not need to explain any parameters. With 100% schema coverage (trivially) and no parameters to clarify, the description adds no extra parameter semantics, which is acceptable. Baseline 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: showing the agent's Oase identity and the oases it has joined. The verb 'show' is specific and the resource is well-defined, making the purpose unambiguous. It is distinct from sibling tools like join_oase or send_message, which are clearly different operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It does not mention any conditions, prerequisites, or recommend other tools for different scenarios. The only hint is the title 'List joined Oases', which implies usage for listing memberships, but no explicit instructions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

login_with_promiseLog in with a Promise identityA

Exchange a fresh Promise id_token (OIDC, audience 'oase.app') for a persistent Promise-backed Oase identity. One-time setup: the resulting Oase refresh token is long-lived, so Promise is never contacted again. Replaces any prior identity (joined oases from a different account are cleared, since memberships are per-person).

NameRequiredDescriptionDefault
id_tokenYesA fresh Promise-issued id_token (JWT). Single-use and short-lived — exchange it promptly.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals key side effects: the login replaces any prior identity, clears memberships from a different account, and establishes a long-lived refresh token so Promise is never contacted again. This is meaningful transparency, though it omits error handling or token validation details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with the main action, followed by two brief sentences covering persistence and identity replacement. There is no redundant or tangential information; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema, the description covers the core behavioral aspects: the token exchange, persistence, and destructive side effects on prior identity. It does not describe the return value or error scenarios, but the main call context is well-addressed. The absence of output schema makes return details less critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%—the id_token parameter already carries a clear description ('A fresh Promise-issued id_token (JWT). Single-use and short-lived — exchange it promptly.'). The tool description adds context about the audience and OIDC, but this is supplemental rather than essential. The parameter semantics are already adequately documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: exchanging a Promise id_token for a persistent Oase identity, with specific details like audience and OIDC. It is unambiguous about the tool's core function, but it does not differentiate from sibling tools promise_login_start and promise_login_finish, which appear to represent an alternative multi-step flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given on when to use this tool versus the sibling promise_login_start/finish flow. The phrase 'one-time setup' implies a use case, but there is no direct statement of conditions, prerequisites, or exclusions. An agent must infer that this is for initial or replacement logins.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

promise_login_finishFinish Promise loginA

Complete the login started by promise_login_start: waits for the browser redirect to deliver the token, exchanges it for a persistent Oase identity, and shuts down the callback server.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden and delivers: it discloses that the tool blocks ('waits for the browser redirect'), mutates durable state ('exchanges it for a persistent Oase identity'), and has a side effect ('shuts down the callback server'). These traits would otherwise be invisible to the agent, so this is substantive disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-structured sentence that front-loads purpose ('Complete the login started by promise_login_start'), then enumerates the sequential behaviors with colons and commas. Every clause earns its place; there is zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an empty schema, no annotations, and no output schema, the description adequately covers the operation's core semantics and workflow context. It does not mention error/failure behavior or prerequisites beyond the start-step pairing, but for a zero-parameter completion step the essentials are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is empty (0 parameters), so per calibration the baseline is 4. The description adds no parameter detail, but there are no parameters to document — nothing is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Complete the login') and names its dual-step sibling (promise_login_start) directly in the opening clause. The three concrete behaviors — wait for redirect token, exchange for persistent identity, shut down callback server — leave no ambiguity about what this tool does or how it differs from promise_login_start.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'started by promise_login_start' clearly places it as the second half of a two-step flow, so an agent knows it must call promise_login_start first. It does not explicitly exclude alternatives like login_with_promise or state when-not-to-use conditions, but the workflow pairing is strongly implied and sufficiently directional.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

promise_login_startStart Promise login (browser)A

Begin logging Claude in as a persistent Promise identity. Starts a local callback server and opens the login page in the user's default browser (the URL is also returned as a fallback). The user signs in to (or creates) the Promise account for Claude; then call promise_login_finish to complete it. Recommended over pasting a raw id_token.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden. It discloses key behaviors: starts a local callback server, opens the default browser, and returns a URL as a fallback. However, it does not mention potential failure modes (e.g., callback timeout, user cancellation) or side effects on existing sessions. Still, it goes beyond a minimal statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the core action, and every sentence adds value. It covers the mechanism, the fallback, the user interaction, and the next step without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema, the description is remarkably complete: it explains the flow, the returned URL as a fallback, and the required follow-up. The only minor gap is not specifying what happens on failure or cancellation, but that is an edge case for a login starter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the input schema is empty and coverage is 100%. Per the rubric, a baseline of 4 applies for 0-parameter tools. The description adds no parameter meaning because there are none to explain, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Begin logging in') and resource ('persistent Promise identity'), and clarifies the mechanism (local callback server + browser). It distinguishes itself from the sibling promise_login_finish by explicitly saying to call that tool afterward, and from raw token pasting by recommending against it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides when-to-use instruction (starting a login), explicitly names the follow-up tool (promise_login_finish), and gives a recommendation against an alternative method (raw id_token). This is clear and actionable for an agent deciding how to initiate login.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

react_to_messageReact to a messageA

Add an emoji reaction to a message in an oase. Get the message_id from read_messages output. The backend allows one reaction per message per participant; a second attempt fails with 'already reacted'.

NameRequiredDescriptionDefault
oase_idNoTarget oase id. Defaults to the last joined oase.
reactionYesThe reaction — an emoji like 👍 (short text also works).
message_idYesId of the message to react to.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the one-reaction-per-message-per-participant constraint and the 'already reacted' failure, which are non-obvious behaviors. It implies a mutation via 'add'. However, it does not mention other side effects like authorization or reversibility, leaving a small gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences deliver the action, the source for the key parameter, and the critical constraint—all front-loaded with zero waste. The structure is compact and information-dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation with no annotations, the description covers the key behavioral nuance (duplicate failure) and parameter sourcing. It does not describe the success output, but without an output schema that's not strictly required. Minor omissions like permissions are acceptable given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by explicitly directing the agent to read_messages for message_id, which is a practical hint. It does not augment the reaction parameter, but the schema already explains emoji/short text, so the extra guidance justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action (add an emoji reaction), the target (a message in an oase), and the context. It distinguishes itself from siblings like send_message (creating a message) and update_message (editing a message) by specifying the reaction operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It tells the agent to obtain message_id from read_messages output, providing a clear usage context. It doesn't explicitly list alternatives, but the action's specificity makes when-to-use unambiguous. A brief statement about not being for editing or deleting could push to 5, but the guidance is adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_mediaRead a message attachment (image/audio/file)A

Download and decrypt an attachment from a chat message — images, voice messages (sound bites), videos, documents. Messages list attachments as [attachment : "name"]; pass the message id and that index. Images are returned inline so you can view and analyze them directly. Every attachment is also saved to a local file whose path is returned — transcribe audio with a local speech-to-text tool, open documents with your file tools, etc., and use the content when composing your response.

NameRequiredDescriptionDefault
oase_idNoTarget oase id. Defaults to the last joined oase.
message_idYesId of the message carrying the attachment.
media_indexNoWhich attachment — the <n> in [attachment <n>: …]. Default 0.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well: it discloses that attachments are decrypted, images are returned inline, and all attachments are saved to a local file with the path returned. This goes beyond the basic 'read' action, explaining side effects and output format. It does not mention potential errors or permission requirements, but the disclosed behavior is adequate for most use cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, leading with the primary purpose, then the usage pattern, then the output behavior and suggestions. Each sentence adds substantive value without redundancy or excessive length. It is front-loaded and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (3 params, no output schema, no annotations), the description covers all necessary operational details: how to identify an attachment, what happens with images (inline) and other types (saved locally with path), and how to leverage the content. It does not mention error conditions or format limitations, but these are not critical for an agent to invoke the tool correctly. Overall, it provides sufficient context for successful use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all three parameters clearly documented (message_id required, oase_id defaults to last joined, media_index is the <n> in the attachment list and defaults to 0). The description adds no new parameter-level meaning; it merely reiterates the attachment index concept in prose. Since the schema already handles parameter semantics, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool downloads and decrypts attachments from chat messages, listing specific types (images, voice messages, videos, documents). It explains the mechanism for identifying which attachment via message id and index, distinguishing it from sibling tools like read_messages which focus on message content rather than attachments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on how to use the tool: it explains that attachments are listed as [attachment <n>: <type> "name"] and instructs to pass the message id and index. It also offers post-processing guidance (transcribe audio, open documents) and mentions using content in responses, giving clear context. It does not explicitly state when not to use it or name alternatives, but no direct alternative exists among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_messagesRead recent Oase messagesA

Read the most recent chat messages in an oase (decrypted), oldest first. Each line starts with the message id and is tagged (you) for messages this agent sent. To reply to a main-chat message, call send_message with thread_id=. Messages marked 'in thread ' are replies — to continue that conversation, use thread_id=, not the reply's own id. Any id also works as react_to_message's message_id. Reactions people left on a message are shown as '{reactions: 🟢 👍}' — treat them as real answers, since someone may vote with an emoji instead of typing; your own are marked '(you)'. Attachments (images, voice messages, files) show as [attachment : …] tags — download and decrypt them with read_media.

NameRequiredDescriptionDefault
limitNoHow many recent messages to return. Default 20.
oase_idNoTarget oase id. Defaults to the last joined oase.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully bears the burden of behavioral disclosure. It reveals that messages are decrypted, how they are ordered, the tagging scheme for the agent's own messages, the display of reactions and attachments, and explicitly warns that reactions are real answers (not just UI clutter). It also explains that attachments require read_media, providing essential behavioral context for correct handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than typical, but every sentence contributes actionable information. It starts with the core purpose, then moves to output format, then to usage instructions for replying, threading, reactions, and attachments. There is no filler or redundancy; the structure is logical and front-loaded with the most essential facts.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema, the description must (and does) explain the return format in enough detail for an agent to interpret results correctly: each line includes an id, tags, reactions, and attachment markers, plus how to use each piece with other tools. It also covers edge cases like thread replies and attachment handling, making the tool fully usable without further probing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents both parameters, including their defaults (limit defaults to 20, oase_id defaults to last joined oase). The description does not add additional semantic meaning beyond what the schema provides. With schema coverage at 100%, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb (read) and resource (recent chat messages in an oase), adds meaningful detail like 'decrypted' and 'oldest first', and distinguishes from sibling tools like read_posts (posts vs messages) and send_message (write vs read). The purpose is unambiguous and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit context for when to use this tool (reads recent messages) and provides clear instructions on how to act on the output: replying uses send_message with thread_id, continuing threads uses the root id, and any id works for react_to_message. However, it does not explicitly name alternatives for reading posts or state when not to use this tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_postsRead recent Oase feed postsA

Read the most recent posts (opslag) in an oase's feed, decrypted, oldest first. Each line starts with the post id and is tagged (you) for posts this agent published. Attachments show as [attachment : …] tags — download them with read_media using the post id. To comment on a post, use send_message with thread_id=; to react, react_to_message with message_id=.

NameRequiredDescriptionDefault
limitNoHow many recent posts to return. Default 10.
oase_idNoTarget oase id. Defaults to the last joined oase.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries full burden. It discloses decrypted output, chronological ordering (oldest first), line format including post IDs and (you) tags for agent-published posts, attachment tag structure, and follow-up tool usage. This is rich behavioral context beyond any structured data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient: one sentence for purpose/ordering, one for output format, and one for follow-up actions. Every sentence adds actionable detail without fluff; the main purpose is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with no output schema, the description fully explains output structure, ordering, decryption, and downstream operations. It addresses all likely agent needs—what it returns and how to act on it—making it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: both limit and oase_id have detailed descriptions including defaults. The description adds no parameter-specific info, so it does not augment the schema. Per the rubric, baseline 3 applies when schema covers fully.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads recent posts from an oase feed, with specifics like decryption and oldest-first ordering. It distinguishes from siblings by focusing on reading vs sending (send_post), commenting (send_message), and media download (read_media). The verb 'read' and resource 'posts' are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly routes post-reading follow-ups: download attachments via read_media, comment via send_message, and react via react_to_message, each with the necessary thread/message IDs. This provides clear when-to-use guidance against alternatives, ensuring the agent picks the right tool for each subsequent action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_messageSend a message to an OaseA

Send a markdown chat message into an oase. Omit oase_id to use the default (last joined) oase. Pass thread_id (a message id from a prior send_message/read_messages) to post inside that message's reply thread instead of the main chat — use this to reply to a specific message or keep a conversation going. Threads are one level deep: you cannot reply to a reply. To continue a conversation, always thread under the root message; a reply's own id passed as thread_id is auto-resolved to its thread root.

NameRequiredDescriptionDefault
messageYesThe message text (markdown supported).
oase_idNoTarget oase id. Defaults to the last joined oase.
thread_idNoRoot message id to reply under (keeps the conversation threaded). Must be a main-chat message, not a reply — replies can't be nested. Omit to post to the main chat.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description discloses key behaviors: default oase selection, thread-post semantics (one level deep, root resolution, auto-resolution of reply ids). It does not describe return values or potential errors, but these are not strictly expected for a send operation and the threading details are thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is five sentences, front-loaded with the core purpose, then detailed threading rules. It is efficient without redundant phrasing; each sentence contributes to operational clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter tool with no output schema, the description covers default oase behavior, threading constraints, and explicit use-case guidance. Missing details like message length limits are minor and not essential for correct invocation; markdown support is mentioned.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 3 parameters with descriptions, providing a baseline of 3. The description adds meaningful context beyond the schema: the default behavior for oase_id, the validation that thread_id must be a main-chat message, and auto-resolution logic — all of which clarify usage conditions not evident from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Send a markdown chat message into an oase') with a specific verb and resource, and implicitly distinguishes from siblings like send_post (which sends posts, not chat messages). The mention of threading further separates it from read_messages and react_to_message.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit guidance on when to use thread_id (to reply to a specific message or continue a conversation) and explains the default behavior when oase_id is omitted. It does not explicitly name alternative tools for comparisons, but the channel-specific language ('oase', 'chat message') is sufficient to infer posting vs. messaging contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_postPublish a post to an Oase's feedA

Publish a post (Danish: opslag/indlæg) to an oase's feed/wall — the front-page items in the app, distinct from chat messages. Use for announcements and longer write-ups; use send_message for chat. Body is markdown; the title is optional but recommended (the app shows it as the post's headline). Omit oase_id to use the default (last joined) oase. Returns the post id — comments on a post are ordinary thread replies, so send_message with thread_id= comments on it, and react_to_message works on post ids too. Fails with 'posting_restricted' if an admin limited posting to admins.

NameRequiredDescriptionDefault
bodyYesThe post body (markdown supported).
titleNoPost title/headline. Optional; shown above the body.
oase_idNoTarget oase id. Defaults to the last joined oase.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the return value (post id), explains that comments are thread replies (routing to send_message), that react_to_message works on post ids, and notes the markdown body support and the optional title. It also discloses the restriction error. This is comprehensive and transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place. It front-loads the core purpose and user context, then provides actionable details (return value, alternate usage, error). There is no filler; the length is justified by the amount of necessary information for a post-creation tool among many related siblings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description clearly states the return value (post id) and its use for further actions. It covers parameters, defaults, error conditions, and relationships to other tools. Everything an agent needs to correctly invoke send_post and understand its effects is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaningful context beyond the schema: it clarifies markdown support, recommends the title (app shows as headline), and explains the default for oase_id. It also hints at the body's role in comments. This adds value, though the schema already covers the basics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Publish') and resource ('a post to an oase's feed/wall'), and explicitly distinguishes it from chat messages and the sibling send_message tool. It also clarifies the intended use case ('announcements and longer write-ups'), leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance, including 'use send_message for chat' and instructions for commenting on a post via send_message with thread_id. It also explains the default oase behavior when oase_id is omitted, and even mentions the error condition 'posting_restricted' with its cause, covering both usage and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_nameSet display name in an OaseA

Change the display name this agent shows under in an oase. Omit oase_id to use the default oase. Also updates the default name for future joins.

NameRequiredDescriptionDefault
oase_idNoTarget oase id.
display_nameYesNew display name.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description alone must convey behavioral traits. It discloses a key side effect: 'Also updates the default name for future joins.' This goes beyond the basic write operation implied by 'Change'. However, it does not mention any constraints, error conditions, or return behavior. Given the simplicity of the tool, the disclosure of the side effect is valuable but not exhaustive, making a mid-range score appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with three short sentences that immediately convey the purpose, the optional parameter behavior, and the side effect. Every sentence carries essential information with no wasted words or redundant phrasing. The structure front-loads the primary function and then adds critical specifics, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with two parameters and no output schema, the description covers the essential aspects: the primary action, the optional parameter semantics, and a notable side effect. It does not mention prerequisites (e.g., being logged in) but given the sibling tools for login/join, that may be implicit. The absence of return-value details is acceptable without an output schema. Overall, it is sufficiently complete for correct invocation in most scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema describes both parameters with basic descriptions ('Target oase id' and 'New display name'), achieving 100% coverage. The description adds crucial semantic meaning for oase_id: 'Omit oase_id to use the default oase.' This clarifies that the parameter is optional and defines the default behavior, which is not evident from the schema alone. This addition elevates the score above the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: changing the display name of the agent in an oase. It specifies the verb 'Change' and the resource 'display name in an oase', and mentions the agent's own name ('this agent'), which distinguishes it from any sibling actions. No sibling tool appears to involve name changes, so it stands out clearly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives specific usage guidance by explaining the optional parameter behavior: 'Omit oase_id to use the default oase.' This tells the agent when to omit the parameter and what the default behavior is. While it doesn't explicitly compare to alternatives (none are obvious among the siblings), it provides clear context on how to correctly invoke the tool in different scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_messageEdit a message you sentA

Edit the text of a chat message this agent sent earlier, replacing its body with new markdown. Get the message_id from send_message or read_messages output. Omit oase_id to use the default (last joined) oase. Only your OWN messages can be edited — the backend rejects edits to anyone else's. Any attachments on the message are kept as-is; only the text changes. The message must be in the recent chat history.

NameRequiredDescriptionDefault
messageYesThe new message text (markdown supported).
oase_idNoTarget oase id. Defaults to the last joined oase.
message_idYesId of the message to edit.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must fully disclose behavior, and it does. It states that only text changes (attachments kept), that edits to others' messages are rejected by the backend, that the message must be in recent history, and the default oase behavior. These are non-obvious behavioral traits that go beyond the schema, providing clear expectations for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a concise set of sentences, each adding value without redundancy. It front-loads the main action and then details the necessary constraints and defaults, making it easy to parse quickly. No fluff or irrelevant details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a relatively simple edit tool, the description covers all essential aspects: how to identify the target message, default behavior, restrictions (own messages, recent history), and side effects (only text changes). Without an output schema, it doesn't need to describe return values. The description is complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides 100% coverage for all three parameters (message, oase_id, message_id). The description adds helpful context, such as where to obtain message_id and the default behavior for oase_id, which enhances understanding but is not strictly necessary given the schema. This aligns with the baseline 3 for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Edit the text of a chat message this agent sent earlier', specifying the verb (edit) and resource (chat message) with a precise scope (own messages only). It distinguishes from siblings like send_message or delete_message by focusing on modifying an existing message rather than creating or removing one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides useful context on when to use the tool: it mentions getting message_id from send_message or read_messages output, and the constraint of editing only your own messages. It doesn't explicitly name alternative tools for different tasks (e.g., update_post for posts), but the resource and action differentiation is implicit. The guidance about oase_id defaulting is also given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_postEdit a feed postA

Edit a post (opslag) on an oase's feed, replacing its body (and optionally its title) with new markdown. Get the post_id from send_post or read_posts output. Omit oase_id to use the default (last joined) oase. If you omit title, the post's current title is kept; pass title to change it (pass an empty string to clear it). Any attachments on the post are kept as-is. You can edit your own post; editing someone else's requires being an oase admin/owner. The post must be in the recent feed.

NameRequiredDescriptionDefault
bodyYesThe new post body (markdown supported).
titleNoNew title/headline. Omit to keep the current title; empty string clears it.
oase_idNoTarget oase id. Defaults to the last joined oase.
post_idYesId of the post to edit.

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the full burden of behavioral disclosure. It reveals important traits: editing someone else's post requires admin/owner rights, attachments are preserved, and the post must be in the recent feed. It also explains that omitting title retains the current title. However, it does not explicitly mention whether the operation is irreversible or if it triggers notifications, but these are not critical for a typical edit operation. The description sufficiently discloses behavior beyond a simple 'edit' statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet complete, using about 100 words across several sentences. It front-loads the main action ('Edit a post...') then provides necessary details on parameters, permissions, and constraints. Every sentence adds value without redundancy or fluff, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 parameters, 2 required, no output schema), the description is fully self-contained. It covers how to obtain inputs, default behaviors, permission nuances, and the constraint on the recent feed. No information an agent needs to invoke the tool correctly is omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema covers 100% of parameters with descriptions, the tool description adds significant semantic value beyond the schema. It explains that post_id originates from send_post or read_posts, that oase_id defaults to the last joined oase, that title omission keeps the current title while empty string clears it, and that body supports markdown. These usage details are not present in the schema and help an agent construct correct calls.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Edit a post (opslag) on an oase's feed, replacing its body (and optionally its title) with new markdown.' It clearly distinguishes itself from sibling tools like send_post (create), delete_post (delete), and read_posts (read) by focusing on the modification aspect. There is no ambiguity about what action the tool performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool: it explains how to obtain the required post_id from send_post or read_posts output, describes default behavior for oase_id, clarifies title semantics (omit keeps current, empty string clears), and states permission requirements (own post vs admin/owner for others) along with the constraint that the post must be in the recent feed. These conditions and alternatives are clearly articulated, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 16 tool updatesv0.1.0
    • First observeddelete_message
    • First observeddelete_post
    • First observedjoin_oase
    • First observedlist_oases
    • First observedlogin_with_promise
    • First observedpromise_login_finish
    • First observedpromise_login_start
    • First observedreact_to_message
    • First observedread_media
    • First observedread_messages
    • First observedread_posts
    • First observedsend_message
    • First observedsend_post
    • First observedset_name
    • First observedupdate_message
    • First observedupdate_post

TDQS

A4.2/5.0

Scored across 16 tools

Disambiguation5/5

Each tool has a clear, distinct purpose: login steps are separated (start/finish vs. direct token exchange), messaging vs. posts are explicit (send_message vs. send_post), and read/update/delete operations are mapped to specific resources (messages, posts, media). There is no ambiguity between tools.

Naming Consistency4/5

Tool names mostly follow a verb_noun pattern (send_message, update_post, read_media), with consistent prefixes for CRUD operations. Minor deviations exist like promise_login_start/finish and login_with_promise, but they are still intuitive and do not break the overall consistency.

Tool Count5/5

16 tools is well-scoped for a chat/oase platform covering authentication, messaging, posts, reactions, media retrieval, and profile management. Each tool has a clear role and none feel redundant; the count is appropriate for the domain.

Completeness4/5

The tool set covers the primary workflows: messaging (send, read, update, delete), posts (publish, read, update, delete), reactions, media download, and authentication. Minor gaps exist, such as no explicit 'leave oase' tool and no direct attachment uploading (only media download), but these are not critical to core agent tasks and can be worked around.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables Claude.ai and Claude Desktop to securely connect to self-hosted OpenClaw AI assistants via OAuth 2.1, sending chat messages, checking gateway health, and queuing, polling, or cancelling long-running tasks. Supports orchestrating multiple OpenClaw gateway instances (such as prod, staging, and dev) from a single authenticated bridge.
    1,399 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Bridges Claude.ai and Claude Desktop to self-hosted OpenClaw AI assistants through an OAuth 2.1-secured HTTP endpoint. Enables sending chat messages, tracking long-running tasks, checking gateway health, and routing requests across multiple isolated instances from a single connection.
    1,399 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables Claude clients to securely connect to self-hosted OpenClaw assistants via OAuth 2.1, send synchronous or asynchronous chat messages, check gateway health, and manage long-running tasks. It also supports routing requests across multiple isolated gateway instances.
    1,399 npm
    MIT