AI Coach MCP Server
It connects Claude to the local AI Coach desktop pet so the mascot can react to the conversation, be cared for, show messages/activity, preview local files, and store the user's memos.
Dashboard & status: open/refresh the mascot dashboard and read state (health, mood, growth stage, hunger/tiredness/sickness ratios, sleep/walk status, available actions).
Care actions: prepare and commit care (feed, sleep, wake, toggle walk, nurse) — only after the user confirms in the dashboard.
Speech & activity: show a short text in the mascot's speech bubble, or have it act out your activity (thinking, working, waiting, succeeded, failed, idle).
Local previews: show a local file (markdown/text/HTML/images/Mermaid) or a repository's Git graph in the app; file contents and commit history are never returned to the model.
Memos: list, read, search, create/replace/append, and delete Markdown memos, with user confirmation and conflict protection.
Preferences: remember whether the dashboard skips its confirmation dialog for care buttons.
Allows opening a local Git repository's commit graph (branches, tags, merges) in the AI Coach app, returning only a small summary to the model rather than the commit history.
Click 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., "@AI Coach MCP ServerMake the AI Coach do a happy dance and show 'Great job!'"
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.
AI Coach MCP Server
MCP server that connects Claude to the AI Coach desktop pet running on the same machine. The mascot on the desktop reacts to the conversation: it shows its state, accepts care, speaks a short message, acts out what the assistant is doing, previews a local file, and stores the user's memos.
日本語の説明は下にあります。
Requirements
The AI Coach desktop app, installed and running (macOS 26+ / Windows 10+). Download it from https://aic0t.com. This server does nothing on its own — it is a client of the app's Local Automation API.
Node.js 22 or later (bundled with Claude for macOS and Windows).
Related MCP server: screenmcp-claude-plugin
Install
Claude Desktop (recommended)
Install the .mcpb bundle from the Releases page
by opening it with Claude Desktop.
Claude Code / Cursor
npx @aic0t/ai-coach-mcp --helpclaude mcp add -s global ai-coach -- npx -y @aic0t/ai-coach-mcpThe AI Coach app also generates the same snippet for you under AI Settings → Integration.
Tools
Tool | What it does | Changes state |
| Show mascot state and open the dashboard | no |
| Re-read state for the dashboard view | no |
| List care actions that are currently possible | no |
| Apply a care action the user confirmed | yes |
| Show a short text in the speech bubble | yes |
| Let the mascot act out the assistant's activity | yes |
| Preview a local file in the app's own viewer | yes |
| Show a local repository's Git graph in the app | yes |
| List memos, newest first (excerpts only) | no |
| Read one memo's Markdown body | no |
| Search memos by title and body | no |
| Create, replace or append to a memo | yes |
| Move a memo to the trash | yes (recoverable) |
| Remember the dashboard's confirmation choice | yes |
Care actions never run on the model's own initiative: prepare_ai_coach_care only reports what is
possible, and commit_ai_coach_care is reachable only from an explicit click in the dashboard view.
How it connects
The AI Coach app writes a discovery file (runtime.json) into its application-support directory
containing a per-session endpoint and token. This server reads that file on every connection
attempt, then speaks the Local Automation API over a Unix domain socket (macOS) or a named pipe
(Windows). Nothing leaves the machine, and no credentials are ever entered by the user.
First connection asks the user. The token in runtime.json is readable by any process running
as the same user, so the app also asks the user to approve the connecting program itself. The first
tool call therefore fails with app_busy / client_approval_pending while AI Coach shows a dialog
naming the program, its location and its code signature. Approve it there and retry; the decision is
remembered per executable, and can be reviewed or revoked under AI settings → Connect. Choosing
"allow, except memos" keeps the connection but withholds the note.* tools.
Privacy Policy
Full policy: https://aic0t.com/privacy
This server runs locally and talks only to the AI Coach app on the same machine. It has no backend of its own and sends no telemetry.
What it reads. Mascot state (health, hunger, tiredness, mood, growth stage, name) and, when a memo tool is called, the memos the user asked for. Memo bodies are returned to the model only for
read_ai_coach_noteandsearch_ai_coach_notes.What it never returns to the model. File contents, image data and full paths handled by
show_ai_coach_file, and the commit history (messages, authors, hashes) and full path of a repository shown withshow_ai_coach_git_graph. Those are rendered in the app's own windows on the user's screen; the tool result carries only a success or failure status and, for the Git graph, the folder name plus branch, commit and ref counts. The session token fromruntime.jsonis never logged or returned.Where data is stored. Memos and mascot state live in the AI Coach app's local data directory on the user's machine. This server stores nothing except a small preferences file recording the dashboard confirmation choice.
Third-party sharing. None. No data is transmitted off the device by this server.
Retention. This server retains nothing between runs beyond that preferences file. Data the app stores is retained and deleted by the app, under the user's control.
Contact. contact.aicoach@gmail.com
Development
npm ci && npm run build && npm testnpm run inspectornpm run build produces dist/server/main.js (a single self-contained ESM file),
dist/view/mcp-app.html (the dashboard view, inlined into one HTML file) and
dist/THIRD-PARTY-NOTICES.md. Those three files are the whole distributable — no node_modules
ships with the bundle.
License
MIT — see LICENSE.
Because dist/ embeds its dependencies, the copyright notices and license texts of every bundled
package are reproduced in dist/THIRD-PARTY-NOTICES.md, which is generated from the bundler's own
module graph on each build and ships with both the .mcpb and the desktop app.
日本語
AI Coach — 卵から育てるデスクトップペット — を Claude から扱うための MCP サーバーです。デスクトップのキャラクターが会話に反応し、様子を見せ、世話を受け、短い言葉を話し、 作業の進捗を体で知らせ、ローカルファイルをプレビューし、メモを預かります。
必要なもの
AI Coach 本体アプリ(macOS 26 以降 / Windows 10 以降)がインストール済みで起動していること。 https://aic0t.com から入手できます。本サーバー単体では何もできません。
Node.js 22 以降(Claude の macOS 版 / Windows 版には同梱されています)。
導入
Claude Desktop では Releases の .mcpb を開くだけ
です。Claude Code / Cursor 用の設定は、AI Coach 本体の「AI 設定 → 連携」からコピーできます。
つなぎ方
本体アプリがセッションごとの endpoint とトークンを runtime.json に書き出し、本サーバーが接続の
たびにそれを読み直して、Unix ドメインソケット(macOS)または名前付きパイプ(Windows)で Local
Automation API を話します。通信は端末内で完結し、ユーザーが認証情報を入力する場面はありません。
初回接続では本体アプリが確認します。 runtime.json のトークンは同じユーザー権限のプロセスなら
読めてしまうため、本体アプリは接続してきたプログラム自体の承認をユーザーに求めます。最初のツール
呼び出しは app_busy / client_approval_pending で失敗し、AI Coach 側にプログラム名・場所・署名を
示すダイアログが出ます。そこで許可してから再実行してください。判断は実行ファイル単位で記憶され、
「AI 設定 → 連携」で確認・取り消しができます。「メモ以外を許可」を選ぶと、接続は通りますが
note.* のツールは使えません。
ライセンス
MIT(LICENSE)。dist/ は依存パッケージを取り込んだ複製物なので、同梱した各パッケージの
著作権表示とライセンス条文は dist/THIRD-PARTY-NOTICES.md に収めてあります(ビルドのたびに
バンドラのモジュールグラフから生成し、.mcpb にも本体アプリにも同梱します)。
プライバシー
正式なポリシーは https://aic0t.com/privacy です。show_ai_coach_file で扱ったファイルの本文・
画像データ・フルパス、および show_ai_coach_git_graph で表示したリポジトリのコミット履歴(メッセージ・
作者・ハッシュ)とフルパスはモデルへ返さず、本体アプリの画面に表示するだけです(Git グラフの結果は
フォルダ名とブランチ・コミット数・参照数の要約だけです)。メモ本文がモデルへ
渡るのは read_ai_coach_note と search_ai_coach_notes を呼んだときに限られます。端末外への送信と
テレメトリはありません。
Available Tools
14 toolscommit_ai_coach_careCommit AI Coach careBIdempotent
Apply a care action that the user confirmed in the dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The care action to apply. | |
| locale | No | Display language (BCP 47). | |
| mascotId | Yes | mascotId of the mascot to act on. | |
| previewToken | Yes | The previewToken returned by prepare_ai_coach_care (valid for 60 seconds). | |
| idempotencyKey | No | Key that keeps a resent click from being applied twice. The server generates one when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| mascots | Yes | |
| preview | No | |
| appLocale | No | |
| updatedAt | Yes | |
| appVersion | No | |
| careResult | No | |
| connection | Yes | |
| capabilities | Yes | |
| protocolVersion | Yes | |
| viewPreferences | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that this is a non-read-only, idempotent write (readOnlyHint=false, idempotentHint=true). The description adds mild behavioral context by noting the action must be user-confirmed, but it does not disclose the persistence/commit effect, failure modes, or expiry behavior beyond what the schema already says about previewToken. There is no contradiction with annotations.
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 sentence with no unnecessary words and leads with the action verb 'Apply'. It is concise and well structured, though it is slightly too terse to carry much orientation value beyond the high-level purpose.
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 detailed input schema and presence of an output schema cover the mechanical details, and annotations cover safety traits. The description, however, only implies the workflow position (after user confirmation, related to prepare_ai_coach_care) rather than stating it, so the contextual picture is adequate but incomplete.
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%, so all five parameters are already fully documented, including the previewToken's origin and 60-second validity. The description adds no new parameter-level meaning, so the high-coverage baseline of 3 applies.
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 identifies a specific verb ('Apply') and a specific resource ('care action'), and adds a meaningful condition ('that the user confirmed in the dashboard'). It is clear, but it does not explicitly distinguish itself from siblings like prepare_ai_coach_care or set_ai_coach_care_confirmation, so it misses the full 5.
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 'confirmed in the dashboard' implies that this tool should be used only after the user has confirmed a care action, and the schema's previewToken description references prepare_ai_coach_care. However, the description itself provides no explicit when-to-use or when-not-to-use guidance, nor does it name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_ai_coach_noteDelete an AI Coach memoADestructiveIdempotent
Move one memo in AI Coach to the trash (recoverable). Ask the user first unless they asked for the deletion themselves; AI Coach also asks them to confirm on screen — note_confirmation_denied means they declined.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Display language (BCP 47). | |
| noteId | Yes | A noteId returned by list / search — a path relative to the memo folder, not absolute. | |
| idempotencyKey | No | Dedupe key for resends; generated when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true and readOnlyHint=false, but the description adds meaningful behavioral context: the delete is recoverable, user confirmation is required, and note_confirmation_denied indicates the user declined. This goes well beyond the structured annotations.
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: the first states the action and recoverability, the second states the user-confirmation behavior and a key error signal. No wasted words; important information 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?
Given the full parameter schema, annotations, and the explicit handling of user confirmation and the declined outcome, the description provides everything an agent needs to invoke and interpret the call correctly. No output schema exists, but the key result states are covered.
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%, so the schema already documents locale, noteId, and idempotencyKey. The description does not need to add parameter details and does not substantially expand on them.
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 uses a specific verb and resource: 'Move one memo in AI Coach to the trash (recoverable)'. This clearly distinguishes delete_ai_coach_note from sibling read/write/list/search tools, and the 'one memo' wording signals single-item scope.
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 gives explicit usage context: ask the user first unless they requested deletion, and AI Coach also performs its own on-screen confirmation. It does not explicitly name alternative tools or state when not to use this tool, but the deletion-focused context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ai_coach_notesList AI Coach memosARead-only
List the user's memos in AI Coach, newest first: noteId, title, modified time, size, group and a short excerpt — not the full body (use read_ai_coach_note for that). Pass 'group' to list one group only, or an empty string for ungrouped memos. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Limit to this group only. An empty string means ungrouped memos only. Omit for all memos. | |
| limit | No | Number of memos to return (default 50, max 200). | |
| locale | No | Display language (BCP 47). | |
| offset | No | How many memos to skip from the top, ordered by most recently updated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses ordering (newest first), returned fields, the absence of full body content, and read-only semantics. Since there is no output schema, this field projection is valuable behavioral information.
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?
Three dense sentences: purpose and ordering first, return fields and the read alternative second, group filtering third. No wasted words.
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 read-only list tool with no required parameters and a fully documented schema, the description covers what is returned, ordering, filtering, and the safe read-only nature. Nothing an agent needs to invoke it correctly is missing.
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 schema already documents group, limit, locale, and offset. The description repeats the group empty-string behavior but does not add meaning beyond the parameter 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?
Description states the specific action (list), the resource (the user's memos in AI Coach), and the result format (newest first with noteId, title, modified time, size, group, excerpt). It also explicitly distinguishes itself from read_ai_coach_note by saying it does not return the full body.
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 clear context: use this to list memos, use read_ai_coach_note for full content, and pass group/empty string to filter. It does not explicitly contrast with search_ai_coach_notes, but the list-vs-search distinction is reasonably inferable from the wording.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_ai_coach_dashboardOpen AI Coach dashboardBRead-only
Show the current state of the AI Coach desktop mascots and open an interactive dashboard. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Display language (BCP 47). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| mascots | Yes | |
| preview | No | |
| appLocale | No | |
| updatedAt | Yes | |
| appVersion | No | |
| careResult | No | |
| connection | Yes | |
| capabilities | Yes | |
| protocolVersion | Yes | |
| viewPreferences | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces the read-only nature. It adds that the tool opens an interactive dashboard, but provides no further behavioral details such as whether it changes UI state or requires any special conditions.
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, front-loaded sentence that states the action and resource clearly, followed by a useful 'Read-only' marker. There is no wasted wording.
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 viewer with one optional parameter, an output schema, and read-only annotations, the description is mostly complete. The only minor gap is that it does not clarify what 'open an interactive dashboard' physically involves or when it should be selected among dashboard-related siblings.
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 fully documents the only parameter (locale) with a BCP 47 pattern and description. The tool description adds no parameter-specific meaning, so the 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's function: showing the current state of AI Coach desktop mascots and opening an interactive dashboard. It is distinct from sibling tools like show_ai_coach_message or show_ai_coach_file, though it does not explicitly name a differentiating sibling.
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 about when to use this tool versus alternatives. The agent can infer it is the dashboard entry point, but the description does not mention exclusions or when to prefer another sibling like refresh_ai_coach_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_ai_coach_carePrepare AI Coach careARead-only
Show which care actions (feed, sleep, wake, walk, nurse) are currently possible for a mascot. Changes nothing; the user must confirm in the dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Display language (BCP 47). | |
| actions | No | Care actions to check. Defaults to every action currently possible for that mascot. | |
| mascotId | No | A mascotId returned by status. Defaults to the primary mascot when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| mascots | Yes | |
| preview | No | |
| appLocale | No | |
| updatedAt | Yes | |
| appVersion | No | |
| careResult | No | |
| connection | Yes | |
| capabilities | Yes | |
| protocolVersion | Yes | |
| viewPreferences | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reinforces the readOnlyHint by saying 'Changes nothing' and adds a workflow detail: the user must confirm in the dashboard. That goes beyond the annotation by explaining where the follow-up action occurs. Error/edge behavior is not discussed, but the output schema and annotations cover much of the remaining context.
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 short sentences front-load the core purpose and the side-effect constraint with no filler. Every phrase earns its place by helping an agent decide when to call the tool and what to expect.
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-only tool with no required parameters, a fully documented input schema, an output schema, and annotations, the description is complete enough. An agent has sufficient structured and textual context to select and invoke 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 description coverage is 100%, so the schema already explains locale, actions, and mascotId; the description adds little parameter-level meaning. The listed 'walk' action is a slightly loose label for the schema enum 'toggle_walk', but the enum remains the authoritative value source.
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 uses a specific verb ('Show') and a clear resource (care actions currently possible for a mascot), and it enumerates the action types. The sentence 'Changes nothing; the user must confirm in the dashboard' clarifies that this is a read-only preflight tool, distinguishing it from state-changing siblings like commit_ai_coach_care.
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 implies when to use it: to discover which care actions are possible before the user confirms. It does not explicitly name alternatives or state exclusions, though 'the user must confirm in the dashboard' hints that confirmation/commit happens elsewhere. This leaves some sibling differentiation to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_ai_coach_noteRead an AI Coach memoARead-only
Read the Markdown body of one memo in AI Coach. When 'truncated' is true, call again with offsetBytes = offsetBytes + returnedBytes. Keep the returned modifiedAt and pass it as expectedModifiedAt when you later write to the same memo. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Display language (BCP 47). | |
| noteId | Yes | A noteId returned by list / search — a path relative to the memo folder, not absolute. | |
| maxBytes | No | Max bytes per call (default and cap 32768). | |
| offsetBytes | No | Byte offset to start reading from. Use it to read the rest when truncated is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behavioral details: truncation/pagination handling via offsetBytes and returnedBytes, and the optimistic concurrency contract involving modifiedAt/expectedModifiedAt. This is genuinely additive context, not just restating annotations.
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?
Four short sentences, each carrying useful information: purpose, pagination rule, concurrency rule, and read-only safety. There is no verbose filler, and the most important action 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?
The description covers the key non-obvious behaviors (pagination, modifiedAt handoff) and the read-only nature. Since there is no output schema, the description mentions response fields like truncated, returnedBytes, and modifiedAt, but it doesn't explicitly name the field for the Markdown body itself. Minor gap, but the core calling contract is well specified.
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%, so the parameters are already well-documented. The description reinforces offsetBytes usage but does not add meaning beyond what the schema already provides. Baseline 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 uses a specific verb ('Read') and a specific resource ('Markdown body of one memo in AI Coach'), clearly distinguishing it from list/search (which find notes) and write/delete (which mutate them). The scope is explicit 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?
The description gives clear procedural guidance: how to paginate when 'truncated' is true and how to carry modifiedAt forward for later writes. It doesn't explicitly contrast this tool with siblings like show_ai_coach_message or show_ai_coach_file, so it lacks explicit exclusions, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_ai_coach_statusRefresh AI Coach statusARead-only
Re-read the AI Coach mascot state for the dashboard view. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Display language (BCP 47). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| mascots | Yes | |
| preview | No | |
| appLocale | No | |
| updatedAt | Yes | |
| appVersion | No | |
| careResult | No | |
| connection | Yes | |
| capabilities | Yes | |
| protocolVersion | Yes | |
| viewPreferences | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces that with 'Read-only' and the idempotent-sounding 'Re-read'. It adds the dashboard scope but does not describe what the refreshed state contains or how locale affects output; the output schema carries some of that burden.
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 short sentences, front-loaded with the core action and resource, with no filler or irrelevant detail. The 'Read-only' sentence is slightly redundant with annotations but does not hurt at this length.
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 read-only refresh tool with one optional parameter and an output schema, the description covers the essential what and where. It could add a bit more by naming a sibling alternative or explaining when a refresh is needed, but nothing critical is missing.
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%, and the single optional locale parameter is already documented as a BCP 47 display language. The description adds nothing about parameters, but the schema already handles it, so baseline 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 names a specific verb ('Re-read') and resource ('AI Coach mascot state'), scopes it to the dashboard view, and explicitly labels it read-only. This clearly distinguishes it from mutation siblings like write_ai_coach_note or commit_ai_coach_care.
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 gives clear context: use this to re-read the mascot state for the dashboard view, and 'Read-only' signals it is a safe status refresh. It does not explicitly name alternatives or state when not to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_ai_coach_activityReport your activity to the mascotAIdempotent
Let the AI Coach mascot act out what you are doing, with its own animation and speech bubble. Call with 'thinking' or 'working' when starting a task (optionally with a short label), 'waiting' when you need the user, 'succeeded' or 'failed' when you finish. Repeats of the same state are not re-announced, so calling on every step is safe.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | What you are doing, up to 60 characters. | |
| state | Yes | Your own current activity. thinking / working / waiting are ongoing; succeeded / failed are terminal; idle removes the display. | |
| locale | No | Display language (BCP 47). | |
| mascotId | No | A mascotId returned by status. Defaults to the primary mascot when omitted. | |
| ttlSeconds | No | Seconds to keep this state (default 120, max 900). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the idempotentHint annotation, the description adds valuable behavioral detail: repeats of the same state are not re-announced, making frequent calls safe. It also clarifies that 'succeeded' and 'failed' are terminal and 'idle' removes the display, which is more context than the annotation alone provides. No contradiction with annotations.
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 two sentences with no filler. It front-loads the main purpose, then immediately provides the state usage patterns and the important deduplication behavior. Every sentence earns its place and directly helps the agent decide when and how to invoke the tool.
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 covers the essential behavioral contract: what the tool does, when to call it, how states map to scenarios, and why repeated calls are safe. The remaining parameters (locale, mascotId, ttlSeconds) are fully documented in the input schema, and no output schema is provided, so the description is complete for an agent to use the tool 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 the baseline is 3. The description goes beyond the schema by attaching real-world usage semantics to the state values: which states map to task start, user interaction, and completion. It also notes that the label is optional and short, adding practical context not fully captured by 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 tool's purpose: having the AI Coach mascot act out the agent's current activity with animation and a speech bubble. It uses a specific verb ('report') and resource ('activity to the mascot'), making it distinct from sibling tools like show_ai_coach_message or open_ai_coach_dashboard.
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 guidance on when to call the tool: use 'thinking' or 'working' when starting a task, 'waiting' when needing the user, and 'succeeded' or 'failed' when finishing. It does not explicitly mention when not to use it or name alternative tools, but the call patterns are clearly actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ai_coach_notesSearch AI Coach memosARead-only
Search the user's AI Coach memos by title and body text (case-insensitive substring). Returns matching memos with a snippet around the hit. Pass 'group' to search one group only, or an empty string for ungrouped memos. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Search inside this group only. An empty string means ungrouped memos only. Omit to search all memos. | |
| limit | No | Number of hits to return (default 20, max 50). | |
| query | Yes | Term matched case-insensitively against memo titles and body text. | |
| locale | No | Display language (BCP 47). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces that with 'Read-only.' It adds meaningful behavioral detail beyond the annotations: case-insensitive substring matching, matching against title and body, and snippet-around-hit return behavior. No contradiction exists between the description and annotations.
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 and every sentence contributes distinct information: search scope, return behavior, and group filtering. It is front-loaded with the core verb and resource, with no filler or redundancy beyond a brief read-only confirmation.
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 search tool with four fully documented parameters and read-only annotations, the description is largely complete. It explains what is searched, how matching works, and what the response contains at a functional level. Since there is no output schema, a bit more detail about the exact return shape or ordering could help, but the description is sufficient 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?
Schema description coverage is 100%, so the schema already fully documents all four parameters. The description reiterates group semantics and matching behavior but adds little beyond the schema. It earns the baseline 3 for not being harmful or misleading, but it does not elevate 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 uses a specific verb and resource: 'Search the user's AI Coach memos by title and body text (case-insensitive substring).' It clearly distinguishes the search behavior from sibling list/read tools by mentioning snippet-around-hit results. 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 concrete usage context for the 'group' parameter: search one group only, use empty string for ungrouped memos, and omit to search all. It also states the operation is read-only. However, it does not explicitly compare this tool with alternatives like list_ai_coach_notes or read_ai_coach_note, so it stops short of full when-to-use-vs-alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_ai_coach_care_confirmationRemember the dashboard confirmation choiceAIdempotent
Remember whether the AI Coach dashboard asks for confirmation before its own care buttons take effect. Dashboard use only; care that the model asks for is always confirmed by the user.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Display language (BCP 47). | |
| skipCareConfirmation | Yes | Whether pressing a dashboard button skips the confirmation card. Setting it to true runs the action without confirmation from then on (requests coming from the model are unaffected). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| updatedAt | Yes | |
| protocolVersion | Yes | |
| viewPreferences | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the idempotent/destructive annotations, the description reveals that the setting only affects dashboard care buttons while leaving model-requested care untouched. It implies persistence with 'Remember whether,' though it does not spell out that the choice is stored or how it interacts with an existing value.
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 short sentences deliver purpose, scope, and an exclusion without redundant phrasing. The main behavior is front-loaded and every clause 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 low-complexity boolean setter with one required parameter, rich schema descriptions, and an output schema, the description covers all essential call context. It states what is affected, what is not, and the mutation's persistence is captured by the schema's 'from then on.'
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%, so the baseline applies. The description adds contextual scope ('dashboard buttons') but does not need to explain skipCareConfirmation or locale because the schema already documents both accurately.
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 names a specific resource (the AI Coach dashboard confirmation choice) and an action ('Remember whether...'), and immediately scopes it to 'dashboard use only.' This distinguishes it from sibling care-execution tools by stating it controls the dashboard's confirmation behavior, not care actions themselves.
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 explicitly says this is 'dashboard use only' and clarifies the when-not: 'care that the model asks for is always confirmed by the user.' Those statements tell an agent when this preference is relevant and prevent it from using the tool for model-initiated care.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_ai_coach_filePreview a local file in AI CoachAIdempotent
Open a safe local preview beside the AI Coach mascot (md, markdown, txt, mmd, mermaid, html, htm, jpg, jpeg, png, heic, webp, svg; HTML is sandboxed). The file is read only by the AI Coach app; its contents are never returned to the model. Use only for a file the user asked to preview or one created in the current task.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the local file to preview. Allowed: md, markdown, txt, mmd, mermaid, html, htm, jpg, jpeg, png, heic, webp, svg. | |
| locale | No | Display language (BCP 47). | |
| mascotId | No | A mascotId returned by status. Defaults to the primary mascot when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations: HTML is sandboxed, the file is read only by the app, and contents are never returned to the model. This privacy/security context is genuinely valuable for the agent when deciding whether to use the tool. The readOnlyHint=false annotation is not contradicted because the tool still opens a UI preview.
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 compact and front-loaded: the core purpose appears in the first clause, supported formats follow immediately, and the usage restriction is stated in one clear sentence. There is no filler or redundant material.
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 provides everything an agent needs to invoke the tool correctly: allowed formats, sandboxing, privacy behavior, and the exact condition under which use is permitted. Even without an output schema, saying contents are never returned to the model prevents the agent from expecting file content as a return value.
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%, so the schema already documents path, locale, and mascotId. The description repeats the allowed extensions and mentions HTML sandboxing, but does not add meaningful semantics for locale or mascotId beyond what the schema provides. This meets the baseline without exceeding it.
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 names a precise action ('Open a safe local preview'), the resource ('local file'), and the context ('beside the AI Coach mascot'), and explicitly enumerates supported file types. This clearly differentiates it from sibling show tools like show_ai_coach_message or show_ai_coach_git_graph, which target different content.
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 gives an explicit usage gate: 'Use only for a file the user asked to preview or one created in the current task,' telling the agent when the tool is appropriate and implicitly when it is not. However, it does not explicitly name alternatives such as read_ai_coach_note for cases where the model actually needs the file contents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_ai_coach_git_graphShow a repository's Git graph in AI CoachAIdempotent
Open the commit graph (branches, tags, merges, like VS Code's Git Graph) of a local Git repository folder beside the AI Coach mascot. Pass the absolute path of a folder that contains .git. The app reads .git locally and never runs git or touches the network; the model only receives a small summary (branch, commit and ref counts), never the history itself. Use only when the user asked to see the repository history or graph.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of a local folder that contains .git (the repository root). The AI Coach app reads the repository itself; only a small summary comes back. | |
| locale | No | Display language (BCP 47). | |
| mascotId | No | A mascotId returned by status. Defaults to the primary mascot when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses important behavioral traits beyond annotations: the app reads .git locally, never runs git, never touches the network, and the model only receives a small summary rather than the history. This gives an agent confidence about privacy, side effects, and what the action will/won't do.
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 front-loaded with the purpose, then covers prerequisites, behavior, and usage conditions. Every sentence adds value and none are redundant with the schema beyond the path emphasis, which is acceptable for such a critical parameter.
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?
With no output schema, the description usefully explains what the model receives (a summary of branch/commit/ref counts) and that full history is not exposed. Minor gaps remain around invalid paths or non-repository folders, but the essential information for correct invocation 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?
Input schema coverage is 100%, and the description mostly re-emphasizes the path requirement already present in the schema. It does not add meaningful semantics for locale or mascotId beyond their schema descriptions, so the baseline 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 a specific action and resource: opening the commit graph (branches, tags, merges) of a local Git repository, with a helpful VS Code Git Graph analogy. It also explicitly scopes the tool to 'when the user asked to see the repository history or graph,' distinguishing it from file-viewing and note-manipulation siblings.
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 an explicit trigger condition ('Use only when the user asked to see the repository history or graph') and a clear prerequisite (absolute path of a folder containing .git). This effectively tells an agent when to choose this tool and what input it must have ready.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_ai_coach_messageShow a message on the mascotA
Display a short text (up to 140 characters) in the AI Coach mascot's speech bubble. Text only; no images or links.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to show in the speech bubble (up to 140 characters, plain text only). | |
| locale | No | Display language (BCP 47). | |
| mascotId | No | A mascotId returned by status. Defaults to the primary mascot when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description characterizes the action as displaying transient UI content in the mascot's speech bubble, and annotations already indicate non-read-only and non-destructive behavior. It adds the 140-character limit and plain-text restriction, but it does not clarify whether the message replaces an existing one or auto-dismisses.
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 only two sentences long, with the core action and the key limit front-loaded in the first sentence. The second sentence earns its place by ruling out images and links, leaving no filler or repetition.
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 display tool with one required parameter, the description covers the essential information: what to display, where to display it, and what content is not allowed. The locale and mascotId behavior is fully described in the schema, and the annotations cover the safety profile, so only minor behavioral details such as message replacement or auto-dismissal are missing.
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 documents all three parameters—text, locale, and mascotId—with meaningful descriptions, and the context signals report 100% schema description coverage. The tool description only restates the 140-character plain-text constraint for text, adding no substantial semantic value beyond 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 uses the specific verb 'Display', identifies the exact resource ('the AI Coach mascot's speech bubble'), and scopes the action to a short text of up to 140 characters. The closing 'Text only; no images or links' helps distinguish this tool from sibling display tools like show_ai_coach_file and show_ai_coach_git_graph.
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 implies appropriate usage through constraints like 'short text' and 'Text only; no images or links', which tells an agent this tool is not for media content. However, it never explicitly names alternatives or states when to choose this tool over a sibling, so the guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_ai_coach_noteWrite an AI Coach memoAIdempotent
Create, replace or append to a memo in AI Coach — a plain Markdown file on the user's machine, visible in the memo list right away. mode: 'create' (default) / 'replace' / 'append' (also for bodies over the per-call limit). Pass 'group' to file it under a folder, created if missing. When changing an existing memo, read it first and pass its modifiedAt as expectedModifiedAt so the user's own edits are not overwritten. AI Coach asks the user to confirm, so the call can take a few seconds; note_confirmation_denied means they declined.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | create (a new memo, the default) / replace (overwrite the whole body) / append (add to the end; also for bodies over the per-call limit). | |
| group | No | Group to create the memo in. It is created if it does not exist. Ungrouped when omitted. | |
| title | No | File name to use for create. Derived from the first line of the body when omitted. | |
| locale | No | Display language (BCP 47). | |
| noteId | No | Target of replace / append. It cannot be given for create. | |
| content | Yes | Markdown body (up to 32768 bytes per call). | |
| idempotencyKey | No | Dedupe key for resends; generated when omitted. | |
| expectedModifiedAt | No | modifiedAt from read; the write stops with note_conflict if the memo changed since. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavioral context beyond annotations: the user confirmation prompt, multi-second latency, storage as a local Markdown file, optimistic concurrency via expectedModifiedAt, and the meaning of note_confirmation_denied. This complements the idempotentHint=true annotation and does not contradict any annotation.
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 compact, with the core action and resource front-loaded, followed by mode, grouping, concurrency, and confirmation behavior in logical order. Every clause contributes operational meaning; there is no filler or redundancy.
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 covers storage location, modes, group creation, concurrency protection, user confirmation, latency, and a specific error outcome. Since there is no output schema, the absence of a success return description is a minor gap, but the tool can be invoked correctly with the information provided.
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 explaining the purpose of expectedModifiedAt as a guard against overwriting the user's own edits and clarifies mode semantics such as append for large bodies. These additions go beyond the schema's literal parameter 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?
States a specific verb and resource: 'Create, replace or append to a memo in AI Coach.' It further describes the memo as a plain Markdown file visible immediately, and enumerates the three modes. This clearly distinguishes it from read, list, search, and delete siblings.
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 workflow guidance: read an existing memo first and pass its modifiedAt to prevent overwriting user edits. It also gives mode selection advice, including using append for bodies over the per-call limit. It does not explicitly name alternative tools or state when not to use this tool, but the context is clear.
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.
14 tool updates
v0.1.4- Changed
commit_ai_coach_care1 field changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)."
- Changed
delete_ai_coach_note4 fields changed- changed
Input schema / properties / idempotencyKey / descriptionPrevious value: -"Key that keeps a resent delete from being applied twice. The server generates one when omitted."New value: +"Dedupe key for resends; generated when omitted." - changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)." - changed
Input schema / properties / noteId / descriptionPrevious value: -"A noteId returned by list / search. It is a path relative to the memo folder (`minutes.md` / `work/minutes.md`), not an absolute path."New value: +"A noteId returned by list / search — a path relative to the memo folder, not absolute." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": false, - "properties": { - "connection": { - "enum": [ - "connected", - "app_unavailable", - "incompatible" - ], - "type": "string" - }, - "deleted": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "noteId": { - "type": "string" - } - }, - "required": [ - "noteId", - "deleted" - ], - "type": "object" - }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "retryable" - ], - "type": "object" - }, - "folderName": { - "type": "string" - }, - "groups": { - "items": { - "type": "string" - }, - "type": "array" - }, - "hits": { - "items": { - "additionalProperties": false, - "properties": { - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "snippet": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "snippet" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "additionalProperties": false, - "properties": { - "content": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "offsetBytes": { - "minimum": 0, - "type": "integer" - }, - "returnedBytes": { - "minimum": 0, - "type": "integer" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "content", - "offsetBytes", - "returnedBytes", - "truncated" - ], - "type": "object" - }, - "notes": { - "items": { - "additionalProperties": false, - "properties": { - "excerpt": { - "type": "string" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "excerpt" - ], - "type": "object" - }, - "type": "array" - }, - "offset": { - "minimum": 0, - "type": "integer" - }, - "protocolVersion": { - "const": 1, - "type": "number" - }, - "total": { - "minimum": 0, - "type": "integer" - }, - "updatedAt": { - "type": "string" - }, - "written": { - "additionalProperties": false, - "properties": { - "created": { - "type": "boolean" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "created", - "modifiedAt", - "sizeBytes" - ], - "type": "object" - } - }, - "required": [ - "protocolVersion", - "connection", - "updatedAt" - ], - "type": "object" -}New value: +null
- Changed
list_ai_coach_notes2 fields changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": false, - "properties": { - "connection": { - "enum": [ - "connected", - "app_unavailable", - "incompatible" - ], - "type": "string" - }, - "deleted": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "noteId": { - "type": "string" - } - }, - "required": [ - "noteId", - "deleted" - ], - "type": "object" - }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "retryable" - ], - "type": "object" - }, - "folderName": { - "type": "string" - }, - "groups": { - "items": { - "type": "string" - }, - "type": "array" - }, - "hits": { - "items": { - "additionalProperties": false, - "properties": { - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "snippet": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "snippet" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "additionalProperties": false, - "properties": { - "content": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "offsetBytes": { - "minimum": 0, - "type": "integer" - }, - "returnedBytes": { - "minimum": 0, - "type": "integer" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "content", - "offsetBytes", - "returnedBytes", - "truncated" - ], - "type": "object" - }, - "notes": { - "items": { - "additionalProperties": false, - "properties": { - "excerpt": { - "type": "string" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "excerpt" - ], - "type": "object" - }, - "type": "array" - }, - "offset": { - "minimum": 0, - "type": "integer" - }, - "protocolVersion": { - "const": 1, - "type": "number" - }, - "total": { - "minimum": 0, - "type": "integer" - }, - "updatedAt": { - "type": "string" - }, - "written": { - "additionalProperties": false, - "properties": { - "created": { - "type": "boolean" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "created", - "modifiedAt", - "sizeBytes" - ], - "type": "object" - } - }, - "required": [ - "protocolVersion", - "connection", - "updatedAt" - ], - "type": "object" -}New value: +null
- Changed
open_ai_coach_dashboard1 field changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)."
- Changed
prepare_ai_coach_care1 field changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)."
- Changed
read_ai_coach_note4 fields changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)." - changed
Input schema / properties / maxBytes / descriptionPrevious value: -"Maximum bytes to read in one call (both the default and the cap are 32768)."New value: +"Max bytes per call (default and cap 32768)." - changed
Input schema / properties / noteId / descriptionPrevious value: -"A noteId returned by list / search. It is a path relative to the memo folder (`minutes.md` / `work/minutes.md`), not an absolute path."New value: +"A noteId returned by list / search — a path relative to the memo folder, not absolute." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": false, - "properties": { - "connection": { - "enum": [ - "connected", - "app_unavailable", - "incompatible" - ], - "type": "string" - }, - "deleted": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "noteId": { - "type": "string" - } - }, - "required": [ - "noteId", - "deleted" - ], - "type": "object" - }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "retryable" - ], - "type": "object" - }, - "folderName": { - "type": "string" - }, - "groups": { - "items": { - "type": "string" - }, - "type": "array" - }, - "hits": { - "items": { - "additionalProperties": false, - "properties": { - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "snippet": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "snippet" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "additionalProperties": false, - "properties": { - "content": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "offsetBytes": { - "minimum": 0, - "type": "integer" - }, - "returnedBytes": { - "minimum": 0, - "type": "integer" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "content", - "offsetBytes", - "returnedBytes", - "truncated" - ], - "type": "object" - }, - "notes": { - "items": { - "additionalProperties": false, - "properties": { - "excerpt": { - "type": "string" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "excerpt" - ], - "type": "object" - }, - "type": "array" - }, - "offset": { - "minimum": 0, - "type": "integer" - }, - "protocolVersion": { - "const": 1, - "type": "number" - }, - "total": { - "minimum": 0, - "type": "integer" - }, - "updatedAt": { - "type": "string" - }, - "written": { - "additionalProperties": false, - "properties": { - "created": { - "type": "boolean" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "created", - "modifiedAt", - "sizeBytes" - ], - "type": "object" - } - }, - "required": [ - "protocolVersion", - "connection", - "updatedAt" - ], - "type": "object" -}New value: +null
- Changed
refresh_ai_coach_status1 field changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)."
- Changed
report_ai_coach_activity5 fields changed- changed
Input schema / properties / label / descriptionPrevious value: -"Short description of what you are doing (up to 60 characters). Shown on the second line of the bubble."New value: +"What you are doing, up to 60 characters." - changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)." - changed
Input schema / properties / state / descriptionPrevious value: -"Your own current activity. thinking / working / waiting are ongoing; succeeded / failed are terminal and clear themselves; idle removes the display."New value: +"Your own current activity. thinking / working / waiting are ongoing; succeeded / failed are terminal; idle removes the display." - changed
Input schema / properties / ttlSeconds / descriptionPrevious value: -"How long to keep this state, in seconds (default 120, max 900). The mascot quietly returns to normal once it expires."New value: +"Seconds to keep this state (default 120, max 900)." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": false, - "properties": { - "announced": { - "type": "boolean" - }, - "connection": { - "enum": [ - "connected", - "app_unavailable", - "incompatible" - ], - "type": "string" - }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "retryable" - ], - "type": "object" - }, - "expiresAt": { - "type": "string" - }, - "mascotId": { - "type": "string" - }, - "protocolVersion": { - "const": 1, - "type": "number" - }, - "shown": { - "type": "boolean" - }, - "state": { - "enum": [ - "thinking", - "working", - "waiting", - "succeeded", - "failed", - "idle" - ], - "type": "string" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "protocolVersion", - "connection", - "state", - "announced", - "shown", - "updatedAt" - ], - "type": "object" -}New value: +null
- Changed
search_ai_coach_notes2 fields changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": false, - "properties": { - "connection": { - "enum": [ - "connected", - "app_unavailable", - "incompatible" - ], - "type": "string" - }, - "deleted": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "noteId": { - "type": "string" - } - }, - "required": [ - "noteId", - "deleted" - ], - "type": "object" - }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "retryable" - ], - "type": "object" - }, - "folderName": { - "type": "string" - }, - "groups": { - "items": { - "type": "string" - }, - "type": "array" - }, - "hits": { - "items": { - "additionalProperties": false, - "properties": { - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "snippet": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "snippet" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "additionalProperties": false, - "properties": { - "content": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "offsetBytes": { - "minimum": 0, - "type": "integer" - }, - "returnedBytes": { - "minimum": 0, - "type": "integer" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "content", - "offsetBytes", - "returnedBytes", - "truncated" - ], - "type": "object" - }, - "notes": { - "items": { - "additionalProperties": false, - "properties": { - "excerpt": { - "type": "string" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "excerpt" - ], - "type": "object" - }, - "type": "array" - }, - "offset": { - "minimum": 0, - "type": "integer" - }, - "protocolVersion": { - "const": 1, - "type": "number" - }, - "total": { - "minimum": 0, - "type": "integer" - }, - "updatedAt": { - "type": "string" - }, - "written": { - "additionalProperties": false, - "properties": { - "created": { - "type": "boolean" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "created", - "modifiedAt", - "sizeBytes" - ], - "type": "object" - } - }, - "required": [ - "protocolVersion", - "connection", - "updatedAt" - ], - "type": "object" -}New value: +null
- Changed
set_ai_coach_care_confirmation1 field changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)."
- Changed
show_ai_coach_file2 fields changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": false, - "properties": { - "connection": { - "enum": [ - "connected", - "app_unavailable", - "incompatible" - ], - "type": "string" - }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "retryable" - ], - "type": "object" - }, - "fileName": { - "type": "string" - }, - "fileType": { - "enum": [ - "markdown", - "text", - "mermaid", - "html", - "image" - ], - "type": "string" - }, - "mascotId": { - "type": "string" - }, - "protocolVersion": { - "const": 1, - "type": "number" - }, - "shown": { - "type": "boolean" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "protocolVersion", - "connection", - "shown", - "updatedAt" - ], - "type": "object" -}New value: +null
- Added
show_ai_coach_git_graph - Changed
show_ai_coach_message3 fields changed- changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)." - changed
Input schema / properties / text / descriptionPrevious value: -"Text to show in the speech bubble. Up to 140 Unicode scalars and 560 UTF-8 bytes, no control characters."New value: +"Text to show in the speech bubble (up to 140 characters, plain text only)." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": false, - "properties": { - "connection": { - "enum": [ - "connected", - "app_unavailable", - "incompatible" - ], - "type": "string" - }, - "displayDurationSeconds": { - "type": "number" - }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "retryable" - ], - "type": "object" - }, - "mascotId": { - "type": "string" - }, - "protocolVersion": { - "const": 1, - "type": "number" - }, - "shown": { - "type": "boolean" - }, - "updatedAt": { - "type": "string" - } - }, - "required": [ - "protocolVersion", - "connection", - "shown", - "updatedAt" - ], - "type": "object" -}New value: +null
- Changed
write_ai_coach_note5 fields changed- changed
Input schema / properties / expectedModifiedAt / descriptionPrevious value: -"The modifiedAt returned by read. When given, the write stops with note_conflict instead of overwriting if the user or another tool changed the memo first."New value: +"modifiedAt from read; the write stops with note_conflict if the memo changed since." - changed
Input schema / properties / idempotencyKey / descriptionPrevious value: -"Key that keeps a resent write from being applied twice. The server generates one when omitted."New value: +"Dedupe key for resends; generated when omitted." - changed
Input schema / properties / locale / descriptionPrevious value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)." - changed
Input schema / properties / mode / descriptionPrevious value: -"create (a new memo, the default) / replace (overwrite the whole body) / append (add to the end). For a body over the size limit, create it first and then append the rest."New value: +"create (a new memo, the default) / replace (overwrite the whole body) / append (add to the end; also for bodies over the per-call limit)." - changed
Output schema / (root)Previous value: -{ - "additionalProperties": false, - "properties": { - "connection": { - "enum": [ - "connected", - "app_unavailable", - "incompatible" - ], - "type": "string" - }, - "deleted": { - "additionalProperties": false, - "properties": { - "deleted": { - "type": "boolean" - }, - "noteId": { - "type": "string" - } - }, - "required": [ - "noteId", - "deleted" - ], - "type": "object" - }, - "error": { - "additionalProperties": false, - "properties": { - "code": { - "type": "string" - }, - "reason": { - "type": "string" - }, - "retryable": { - "type": "boolean" - } - }, - "required": [ - "code", - "retryable" - ], - "type": "object" - }, - "folderName": { - "type": "string" - }, - "groups": { - "items": { - "type": "string" - }, - "type": "array" - }, - "hits": { - "items": { - "additionalProperties": false, - "properties": { - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "snippet": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "snippet" - ], - "type": "object" - }, - "type": "array" - }, - "note": { - "additionalProperties": false, - "properties": { - "content": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "offsetBytes": { - "minimum": 0, - "type": "integer" - }, - "returnedBytes": { - "minimum": 0, - "type": "integer" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - }, - "truncated": { - "type": "boolean" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "content", - "offsetBytes", - "returnedBytes", - "truncated" - ], - "type": "object" - }, - "notes": { - "items": { - "additionalProperties": false, - "properties": { - "excerpt": { - "type": "string" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "modifiedAt", - "sizeBytes", - "excerpt" - ], - "type": "object" - }, - "type": "array" - }, - "offset": { - "minimum": 0, - "type": "integer" - }, - "protocolVersion": { - "const": 1, - "type": "number" - }, - "total": { - "minimum": 0, - "type": "integer" - }, - "updatedAt": { - "type": "string" - }, - "written": { - "additionalProperties": false, - "properties": { - "created": { - "type": "boolean" - }, - "group": { - "type": "string" - }, - "modifiedAt": { - "type": "string" - }, - "noteId": { - "type": "string" - }, - "sizeBytes": { - "minimum": 0, - "type": "integer" - }, - "title": { - "type": "string" - } - }, - "required": [ - "noteId", - "title", - "created", - "modifiedAt", - "sizeBytes" - ], - "type": "object" - } - }, - "required": [ - "protocolVersion", - "connection", - "updatedAt" - ], - "type": "object" -}New value: +null
13 tool updates
v0.1.2- First observed
commit_ai_coach_care - First observed
delete_ai_coach_note - First observed
list_ai_coach_notes - First observed
open_ai_coach_dashboard - First observed
prepare_ai_coach_care - First observed
read_ai_coach_note - First observed
refresh_ai_coach_status - First observed
report_ai_coach_activity - First observed
search_ai_coach_notes - First observed
set_ai_coach_care_confirmation - First observed
show_ai_coach_file - First observed
show_ai_coach_message - First observed
write_ai_coach_note
TDQS
Scored across 14 tools
Each tool targets a distinct action: dashboard display vs state refresh, care preview vs commit, arbitrary message vs activity report, and the note CRUD tools are clearly separated. Even where two tools touch the dashboard or speech bubble, the descriptions define non-overlapping responsibilities.
All tools follow a consistent verb_ai_coach_[noun] pattern (open, prepare, refresh, commit, show, report, list, read, search, write, delete, set). The naming convention is uniform and the verb clearly indicates the operation.
14 tools is within the well-scoped range for a desktop companion server. Each tool supports a distinct aspect of the mascot experience or memo workflow and none feel redundant.
The set covers the full care lifecycle (prepare, confirm, commit), read-only status and dashboard access, messaging and activity reporting, local previews, and complete note CRUD plus search. There are no obvious dead ends or missing core operations.
Maintenance
Related MCP Connectors
Give Claude only the Google Drive files you choose. Every action logged.
Agent personas for Claude. 16 tools, 13 personas, 3 workflows. Zero extra API cost. Free.
Connect Claude to Fathom meeting recordings, transcripts, and summaries
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables Claude Desktop to monitor and control your computer system with 90+ real-time tools covering CPU, RAM, GPU, disk, network, processes, and more, plus extensions for file management, code editing, and web research.84MIT
- AlicenseNot gradedqualityCmaintenanceEnables Claude to control the local desktop via screenshot, mouse, keyboard, and clipboard operations.MIT
- AlicenseNot gradedqualityBmaintenanceEnables Claude Desktop to control mouse, keyboard, and clipboard on Windows, allowing AI-driven computer interaction tasks like clicking, typing, scrolling, and screenshotting.MIT
- AlicenseBqualityAmaintenanceEnables Claude to interact with Apple apps on macOS including Mail, Calendar, Contacts, Reminders, Notes, and iCloud Drive for personal productivity tasks like triaging email, managing calendar, and cross-app context.767MIT