oase-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@oase-mcpsend a message to the oase saying I'm on my way"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
oase-mcp
An MCP server that lets Claude chat inside an Oase. Give Claude an invite link and it can post into that oase's group chat, publish posts (opslag) to the oase's feed, read the conversation, and react ā handy for status updates, "I finished X", or dropping a note where you'll see it.
It's a REST client: every tool is a plain request/response HTTP call.
š Documentation: https://dev.oase.app/mcp/
Status / disclaimer
This is experimental and provided as-is. It builds on Oase's internal API, which can change without notice ā so it may break, change, or be discontinued at any time, and there's no guarantee it works today or will keep working tomorrow. There's no support commitment: issues are welcome (see SUPPORT.md) but may go unanswered. If you need a supported integration path, use the identity & SCIM integration instead.
Talks to the production Oase backend (api.oase.app) exactly like the app does:
sign in ā join via invite link ā fetch the oase key from KMS ā AES-256-GCM
encrypt ā POST .../messaging/messages. Messages are encrypted client-side
with the oase's symmetric AES-256-GCM key (fetched from the KMS via a
mainframe-signed proof), so they render normally in the app.
Related MCP server: WAHA WhatsApp MCP Server
Architecture
The codebase is a passive REST client with an MCP server on top:
Passive REST client ā
src/client/. Everything that knows how to talk to Oase over HTTP: Promise login/auth (promiseLogin.ts), token refresh and the shared config file (config.ts), and the full REST client (oaseClient.ts) ā joining via invite link, KMS key fetching, AES-256-GCM encrypt/decrypt, and sending/reading messages and feed posts, reactions, and media. No agent behavior, no MCP dependency: it does something only when called. Importable by other consumers via the package root oroase-mcp/client(import { OaseClient, loadConfig } from "oase-mcp"), without pulling in the MCP layer.MCP server ā
src/mcp/. The MCP tool surface over the REST client (server.ts). Every tool is an on-demand request/response wrapper. Entry point:dist/index.js(claude mcp add oase -- node /path/to/dist/index.js).
How it works
Identity. Claude signs in as a persistent Promise user (the identity provider the Oase app uses) via a one-time browser login ā see Logging in. The resulting long-lived Oase refresh token is stored in
~/.oase-mcp/config.json(mode 0600); short-lived access tokens are kept in memory and refreshed automatically.Encryption. Oase encrypts message content with a per-oase symmetric AES-256-GCM key held in escrow by the backend. Any participant can fetch the raw oase key from the KMS via a mainframe-signed proof, so encrypting/decrypting is straightforward ā no device keypairs or enrollment. We produce the exact cipher-bundle shape the app expects.
No message is sent in plaintext ā the send endpoint requires a cipher bundle.
Setup
npm install
npm run buildRegister it with Claude Code (use the absolute path to this checkout):
claude mcp add oase -- node /path/to/oase-mcp/dist/index.jsOr add to your MCP client config manually:
{
"mcpServers": {
"oase": {
"command": "node",
"args": ["/path/to/oase-mcp/dist/index.js"]
}
}
}Logging in
Claude signs in as a persistent Promise user ā a one-time setup:
Call
promise_login_startā it returns a URL. Open it in a browser (incognito is safest so an existing Promise session isn't reused).Sign in to (or create) the Promise account for Claude. The page will say "Token captured".
Call
promise_login_finishā it exchanges the token for a persistent Oase identity.
Under the hood the server hosts a localhost OIDC callback and captures the
single-use id_token from the redirect ā no copy-pasting. (If you already have
an id_token, login_with_promise takes it directly.)
The exchange returns Oase's own long-lived refresh token (keyed to the Promise
person_id), so Promise is never contacted again ā no Promise credentials
are stored, only the resulting Oase refresh token.
Login is required: every other tool (join, send, read, ask) refuses until a Promise identity is established.
Tools
Tool | Args | What it does |
| ā | Start the one-time browser login for a persistent Promise identity; returns a URL to open. |
| ā | Complete the Promise login after signing in in the browser. |
|
| Exchange a Promise |
|
| Join an oase from an invite link ( |
|
| Post a markdown message. With |
|
| Edit the text of a message you sent (only your own). Attachments are kept; only the text changes. |
|
| Delete a message (soft delete). Your own, or anyone's if you're an oase admin/owner. |
|
| Publish a post (opslag) to the oase's feed/wall ā the front-page items in the app, distinct from chat. Markdown body, optional title (shown as the headline). Comments on the post are thread replies: |
|
| Edit a feed post's body (and optionally title; omit |
|
| Delete a feed post. Your own, or anyone's if you're an oase admin/owner. |
|
| Read recent feed posts (decrypted), oldest first, each line prefixed with the post id and tagged |
|
| Add an emoji reaction to a message (one per participant per message). |
|
| Download and decrypt a message attachment (image, voice message / sound bite, file). Images are returned inline so the agent can view and analyze them; every attachment is also saved to a local temp file whose path is returned (e.g. for transcribing audio). |
|
| Read recent messages (decrypted), oldest first, each line prefixed with its message id and tagged |
| ā | Show Claude's Oase identity and joined oases. |
|
| Change the display name Claude posts under. |
Threads and replies
Threads in Oase are one level: every reply to a message lives under that
message's resource id (chat_id <oaseId>/m/<messageId>), and you cannot reply
to a reply ā a nested thread would never be shown in the app. The server
enforces this: a thread_id that points at a reply is auto-resolved to the
thread's root message, so nothing ever lands in an invisible nested chat. To
reply to a message, pass its id as thread_id to send_message; use
read_messages to catch up on context and get the ids.
Attachments (images, voice messages, files)
Messages with attachments show them as [attachment <n>: <mime> "<name>"]
tags in every read result (a voice message is simply an audio/*
attachment, usually audio/mp4). read_media downloads the blob and, for
modern uploads, decrypts it: the app uploads media as an encrypted .oase
container ā [4-byte length][metadata JSON {alg, kid, oaseId, ivBase64}] [ciphertext][16-byte GCM tag] ā encrypted with the same server-escrowed oase
key as text, while the original filename/mime travel as cipher bundles on the
media item (legacy attachments are plaintext blobs behind signed CDN URLs and
pass through unchanged; giphy attachments resolve via their encrypted giphy
object).
What the agent gets back:
Images (jpeg/png/gif/webp up to 3 MB) are returned inline as MCP image content, so the agent can look at them directly and use what it sees in its response. Larger images fall back to the saved file.
Everything is also written to
<tmpdir>/oase-mcp/media/<messageId>-<n>-<name>and the path returned. For audio (Claude can't listen natively) the agent is nudged to transcribe the saved file with a local speech-to-text tool (e.g.hearon macOS orwhisper) and work from the transcript; documents can be opened with normal file tools.
Blob download URLs are provider-signed and expire after ~2 days; read_media
refreshes the chat projection and retries once if a URL has gone stale. Voice
messages / media-only messages have an empty text body and are shown by
read_messages like any other message.
Typical flow
Log Claude in:
promise_login_startā open the URL āpromise_login_finish.In the Oase app, open your oase ā invite ā copy the join link.
Ask Claude: "Join this oase: https://oase.app/oase/ā¦/join/ā¦" ā
join_oase.Ask Claude to "send a message to the oase saying ā¦" ā
send_message, "post an update to the feed" āsend_post, or "what's new in the oase?" āread_messages/read_posts.
Configuration
Environment variables (all optional):
OASE_MCP_CONFIG_DIRā where to storeconfig.json(default~/.oase-mcp).OASE_API_ROOTā mainframe API root (defaulthttps://api.oase.app), e.g. point at staging.OASE_KMS_ROOTā KMS root (defaulthttps://kms.oase.app/, trailing slash required).
Notes & limitations
Works on an oase's group chat (and per-message reply threads) and its feed posts (
send_post/read_postsā text only when sending; a post's title and body are separate cipher bundles under the same oase key). It can read/decrypt media attachments (read_media) but not send them; it doesn't handle private 1:1 chats or realm join-approval flows.Replies can't be nested ā threads are one level deep. A
thread_idthat is itself a reply is silently resolved to the thread's root message (best effort: for a message older than the latest chat page the id is used as-is).Signing in as a different Promise account clears joined oases, since memberships are per-person ā re-invite Claude afterward.
Deleting
~/.oase-mcp/config.jsonforgets the identity (Claude must log in and be re-invited).Many server processes (one per Claude session) share the identity in
~/.oase-mcp/config.json. The backend rotates the refresh token on everyoauth2/refreshand deletes the session if it ever sees a stale one (anti-replay) ā so the access token is persisted for reuse, and refreshes are serialized across processes via~/.oase-mcp/auth.lockwith a re-read under the lock. Don't hitoauth2/refreshout-of-band while servers are running; if the session does get revoked, tools will say so ā log in again withpromise_login_start.
License
MIT ā see LICENSE.
Available Tools
16 toolsdelete_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.
| Name | Required | Description | Default |
|---|---|---|---|
| oase_id | No | Target oase id. Defaults to the last joined oase. | |
| message_id | Yes | Id of the message to delete. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| oase_id | No | Target oase id. Defaults to the last joined oase. | |
| post_id | Yes | Id of the post to delete. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| invite_link | Yes | The full Oase invite link, or '<oase_id> <phrase>'. | |
| display_name | No | Name to show in the oase. Defaults to 'Claude'. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id_token | Yes | A fresh Promise-issued id_token (JWT). Single-use and short-lived ā exchange it promptly. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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'.
| Name | Required | Description | Default |
|---|---|---|---|
| oase_id | No | Target oase id. Defaults to the last joined oase. | |
| reaction | Yes | The reaction ā an emoji like š (short text also works). | |
| message_id | Yes | Id of the message to react to. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| oase_id | No | Target oase id. Defaults to the last joined oase. | |
| message_id | Yes | Id of the message carrying the attachment. | |
| media_index | No | Which attachment ā the <n> in [attachment <n>: ā¦]. Default 0. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many recent messages to return. Default 20. | |
| oase_id | No | Target oase id. Defaults to the last joined oase. |
TDQS
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.
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.
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.
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.
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.
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=.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many recent posts to return. Default 10. | |
| oase_id | No | Target oase id. Defaults to the last joined oase. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The message text (markdown supported). | |
| oase_id | No | Target oase id. Defaults to the last joined oase. | |
| thread_id | No | Root 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The post body (markdown supported). | |
| title | No | Post title/headline. Optional; shown above the body. | |
| oase_id | No | Target oase id. Defaults to the last joined oase. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| oase_id | No | Target oase id. | |
| display_name | Yes | New display name. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The new message text (markdown supported). | |
| oase_id | No | Target oase id. Defaults to the last joined oase. | |
| message_id | Yes | Id of the message to edit. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The new post body (markdown supported). | |
| title | No | New title/headline. Omit to keep the current title; empty string clears it. | |
| oase_id | No | Target oase id. Defaults to the last joined oase. | |
| post_id | Yes | Id of the post to edit. |
TDQS
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.
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.
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.
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.
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.
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.
16 tool updates
v0.1.0- First observed
delete_message - First observed
delete_post - First observed
join_oase - First observed
list_oases - First observed
login_with_promise - First observed
promise_login_finish - First observed
promise_login_start - First observed
react_to_message - First observed
read_media - First observed
read_messages - First observed
read_posts - First observed
send_message - First observed
send_post - First observed
set_name - First observed
update_message - First observed
update_post
TDQS
Scored across 16 tools
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.
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.
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.
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
Related MCP Connectors
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces ā chat, links, and tasks. One-click OAuth.
Let Claude or ChatGPT search, read and send your WhatsApp messages over MCP. OAuth sign-in.
1Create projects, nodes, and tasks in UluP Spaces by conversation with Claude.
- PageliveOAuthio.pagelive
Publish pages straight from Claude as private, branded, tracked links.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables Claude to read and send WhatsApp messages, including media and call history, via a local bridge.MIT
- AlicenseAqualityCmaintenanceEnables Claude to interact with WhatsApp through a unified backend API, providing 20 tools for messaging, media, groups, contacts, and chat management.2229 npmMIT
- AlicenseAqualityDmaintenanceConnects Claude to Open WebUI, enabling chat management, RAG knowledge bases, files, functions, and prompts directly from Claude.2619 npm2MIT
- AlicenseNot gradedqualityCmaintenanceEnables Claude to read and send WhatsApp messages through a self-hosted REST API, supporting multi-user sessions, media, groups, contacts, and webhooks.15 npmMIT