Skip to main content
Glama
aic0t

AI Coach MCP Server

by aic0t

Write an AI Coach memo

write_ai_coach_note
Idempotent

Create, replace, or append Markdown memos in AI Coach and see them in the memo list instantly. Organize notes with groups, and use expectedModifiedAt to avoid overwriting recent changes.

Instructions

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
modeNocreate (a new memo, the default) / replace (overwrite the whole body) / append (add to the end; also for bodies over the per-call limit).
groupNoGroup to create the memo in. It is created if it does not exist. Ungrouped when omitted.
titleNoFile name to use for create. Derived from the first line of the body when omitted.
localeNoDisplay language (BCP 47).
noteIdNoTarget of replace / append. It cannot be given for create.
contentYesMarkdown body (up to 32768 bytes per call).
idempotencyKeyNoDedupe key for resends; generated when omitted.
expectedModifiedAtNomodifiedAt from read; the write stops with note_conflict if the memo changed since.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv0.1.4
    • changedInput schema / properties / expectedModifiedAt / description
      Previous 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."
    • changedInput schema / properties / idempotencyKey / description
      Previous 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."
    • changedInput schema / properties / locale / description
      Previous value: -"Display language hint (BCP 47). The dashboard view passes hostContext.locale through unchanged."New value: +"Display language (BCP 47)."
    • changedInput schema / properties / mode / description
      Previous 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)."
    • changedOutput 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
  2. First observedv0.1.2

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by 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.

Purpose5/5

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.

Usage Guidelines4/5

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.