Skip to main content
Glama

Write a handwritten Wren notebook page

write_notebook_page
Destructive

Write a handwritten study page in the user's Wren notebook (same topic -> target.noteId, not a new note). Write a FULL page (not for verbatim): 110-140 words in 6-8 blocks (a table/figure = ~40 words), a heading per part, 3-6 key terms marked (underline/highlight; a mark copies exact words of its own block), every number+unit and formula marked as math (its latex keeps every word: 20\ \text{m/s}), one accent, at most 1 short marginNote, the takeaway in a callout (key_answer, key_idea) or summary. Pair two <=12-word callouts with layoutHint:"side_by_side". Unknown fields are refused. Editable ink, not the user's own handwriting. Recipes: worked_example = problem callout (box) + 3-4 steps (1-2 sentences + equation each) + Check heading+paragraph + common_mistake & key_answer callouts. concept_summary = definition callout + boxed equation or table/flowchart + 2 headings with 2-sentence paragraphs + key_idea callout. comparison_sheet = 1-sentence intro + 5-6 row table + heading+paragraph on why it matters + common_mistake & key_idea callouts (side_by_side). process_walkthrough = overview + 4-6 steps, each with label (stage name) + 1-2 sentences, optional flowchart showing what the steps don't + key_idea or summary. revision_sheet = 2-3 headings with concise paragraphs/equations + common_mistake & remember callouts (side_by_side) + 4-item checklist. verbatim = text the user gave you to copy: their words unchanged and once, in paragraph/heading blocks, nothing added.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "title": "<title>",
      "pageKind": "<pageKind>",
      "blocks": "<blocks>",
      "llm_model": "<llm_model>"
    },
    "name": "write_notebook_page"
  }
}

Input Schema

NameRequiredDescriptionDefault
titleYesPage title.
accentNoNew note only; an existing notebook keeps its accent.
blocksYes
targetNo
contextNo
subjectNo
pageKindYesworked_example | concept_summary | comparison_sheet | process_walkthrough | revision_sheet | verbatim: recipes above.
planSlotNoContent page k of the plan (cover not a slot); needs target.noteId only.
llm_modelYesThe exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess.
noteTitleNoRename the note (and its cover) when this page widens its topic.
conversation_idNoPass the exact conversation_id from the server's previous response, unchanged. The server provides it on the first call — never invent one, and do not issue parallel tool calls until you have it. Keep passing the same conversation_id for the rest of the conversation, including after later user messages or on a different task; do not reset it when the user starts a new request.

Output Schema

NameRequiredDescriptionDefault
okYes
hintNoSet when the page came out short: what to add.
modeNo
planNo
titleNo
noteIdNo
pageIdNo
noteUrlNoPrivate link to the note in the user's Wren account (opens after sign-in).
outlineNo
locationNo
pageKindNo
pageCountNo
pageNumberNo
strokeCountNo
semanticTypeNo
strokeGroupIdNo
conversationNoteNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed20 schema fields changed
    • addedInput schema / properties / accent / description
      Added value: +"New note only; an existing notebook keeps its accent."
    • addedInput schema / properties / blocks / items / additionalProperties
      Added value: +false
    • changedInput schema / properties / blocks / items / properties / equation / description
      Previous value: -"LaTeX or plain math."New value: +"LaTeX."
    • changedInput schema / properties / blocks / items / properties / figureContent / description
      Previous value: -"table: {\"headers\":[\"Feature\",\"A\",\"B\"],\"rows\":[[\"x\",\"1\",\"2\"]]}; others: get_drawing_guide. title=caption."New value: +"table {headers,rows}; flowchart {nodes:[{id,label}],edges:[{from,to}],cycle:true only if it repeats}; timeline {events:[{id,at,label}]}; bar_chart {bars:[{label,value}]}; graph_2d {curves:[{expr}]}."
    • addedInput schema / properties / blocks / items / properties / items / items / additionalProperties
      Added value: +false
    • changedInput schema / properties / blocks / items / properties / marginNote / description
      Previous value: -"Short fact in right margin."New value: +"Short fact beside this block."
    • changedInput schema / properties / blocks / items / properties / marks / description
      Previous value: -"3-6 key terms per page; every formula, symbol and number+unit (20 m/s) as math."New value: +"On paragraph, callout, summary, checklist, steps, table."
    • addedInput schema / properties / blocks / items / properties / marks / items / additionalProperties
      Added value: +false
    • removedInput schema / properties / blocks / items / properties / marks / items / properties / as / description
      Removed value: -"underline/highlight term; math draws latex."
    • changedInput schema / properties / blocks / items / properties / marks / items / properties / latex / description
      Previous value: -"LaTeX drawn for math."New value: +"math only."
    • changedInput schema / properties / blocks / items / properties / steps / description
      Previous value: -"Ordered steps (label = stage name, explain, optional equation)."New value: +"label = stage name."
    • addedInput schema / properties / blocks / items / properties / steps / items / additionalProperties
      Added value: +false
    • changedInput schema / properties / blocks / items / properties / style / description
      Previous value: -"box=problem, key_answer=answer, definition, key_idea, example, warning/common_mistake, remember, highlight."New value: +"callout: box=problem, key_answer, definition, key_idea, example, warning, common_mistake, remember, highlight."
    • changedInput schema / properties / blocks / items / properties / text / description
      Previous value: -"heading, paragraph, callout, summary text."New value: +"heading, paragraph, callout, summary."
    • changedInput schema / properties / blocks / items / properties / title / description
      Previous value: -"Caption above callout, summary, checklist or figure."New value: +"Caption of a callout, summary, checklist, steps, equation or figure."
    • addedInput schema / properties / context / additionalProperties
      Added value: +false
    • addedInput schema / properties / noteTitle
      Added value: +{
      +  "description": "Rename the note (and its cover) when this page widens its topic.",
      +  "maxLength": 160,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / properties / pageKind / description
      Previous value: -"worked_example problem + 3-4 steps + Check + key_answer; concept_summary definition + equation/figure + 2 headed parts + key_idea; comparison_sheet intro + 5-6 row table + paragraph + 2 callouts; process_walkthrough intro + 4-5 steps + paragraph + summary; revision_sheet 3 headed sections + 2 callouts + 4-item checklist; verbatim user's own text."New value: +"worked_example | concept_summary | comparison_sheet | process_walkthrough | revision_sheet | verbatim: recipes above."
    • changedInput schema / properties / planSlot / description
      Previous value: -"1-based slot from plan_notebook."New value: +"Content page k of the plan (cover not a slot); needs target.noteId only."
    • addedInput schema / properties / target / additionalProperties
      Added value: +false
  2. First observed

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already declare this as a destructive, non-idempotent, open-world write, and the description adds substantial behavioral constraints: word and block budgets, exact-word marks, LaTeX preservation, marginNote limits, layout pairing, and refusal of unknown fields. It does not explain the consequences of target.action values such as replace_page, which is relevant given destructiveHint=true. There is no contradiction with the annotations.

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

Conciseness3/5

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

The purpose is front-loaded, and nearly every clause carries actionable constraints, so there is little true filler. However, the description is a single very dense paragraph with semicolon-chained requirements and recipes, making it harder to scan than it needs to be for such a complex tool.

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

Completeness4/5

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

For a complex 11-parameter tool with nested block objects and an output schema, the description is unusually complete on content generation: it covers page recipes, block counts, marks, callouts, and verbatim handling. It leaves target.action semantics and the destructive replace behavior to the schema and annotations, so it is strong but not fully self-contained.

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?

With 64% schema description coverage, the description adds significant meaning beyond the schema for pageKind recipes, block composition, marks, math latex behavior, marginNote limits, layoutHint side_by_side pairing, and callout styles. It does not clarify several top-level parameters such as planSlot, context fields, llm_model, or conversation_id, though the schema documents those separately.

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

Purpose5/5

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

The description opens with a specific verb and resource: writing a handwritten study page in the user's Wren notebook. It explicitly distinguishes adding to an existing note via target.noteId from creating a new note, and it names supported page kinds. An agent can identify the tool's core function immediately.

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

Usage Guidelines4/5

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

The pageKind recipes provide detailed when-to-use guidance for worked_example, concept_summary, comparison_sheet, process_walkthrough, revision_sheet, and verbatim. It also says same-topic content should target an existing noteId rather than a new note. However, it does not explicitly route the agent away from sibling tools such as draw_figure or plan_notebook.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources