Skip to main content
Glama

Server Details

Portable AI memory you own. Keep memories and notes across Claude, ChatGPT, and other AI tools.

Ownership verified
Status
Healthy
Uptime
100.0% over 41 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation3/5

The write/edit pair overlaps materially: penny_write's ladder includes profile upserts, project creation, and skill previews that penny_edit also handles, and penny_get_skill is a narrower re-entry into penny_read's `target:skills` path. The long routing ladders ("first match wins", "modify with penny_edit") do most of the disambiguation work, but that work is pushed into prose rather than clean tool boundaries, and penny_delete is really "trash+restore" while restore actually lives in penny_edit.

Naming Consistency4/5

A uniform `penny_` prefix with snake_case is used throughout, and most names are verb-first (delete, edit, read, write, get_skill). Two deviate into noun-first/compound forms (penny_session_start, penny_start_setup), which sit awkwardly next to the verb-first majority.

Tool Count4/5

Seven tools is a sensible, deliberately consolidated surface for a broad personal-memory domain covering notes, tasks, trackers, projects, skills, and setup. The trade-off is that two tools (penny_read, penny_write) carry enormous polymorphic responsibility, which compresses count at the cost of clarity.

Completeness4/5

Full lifecycle coverage exists for the core entities — create/edit/trash/restore, revision history, run recording, and onboarding — with intentional variants (tasks cancel rather than delete, trackers archive). Gaps are acknowledged rather than hidden: workspace trackers are unsupported and project reads are limited to a bounded private directory.

Available Tools

7 tools
penny_deleteA
DestructiveIdempotent
Inspect

Move to Trash. Project: projectId + expectedRevision + operationId; penny_edit op:restore recovers. Repeat in_progress with the same operationId; report partial_recovery conflicts. Note/tracker_entry: ids (max100); skill/rhythm: one id; profile_block: ids are block names. Tag/link removal uses the identifiers below. Tasks are canceled via penny_edit; tracker definitions are archived, not deleted.

NameRequiredDescriptionDefault
idsNonote/tracker_entry: IDs to trash, max 100. rhythm/skill: exactly one ID. profile_block: block names to trash.
tagANotag_relation: required edge endpoint to remove.
tagBNotag_relation: required other endpoint.
scopeNoProfile block scope; Project private overrides defaults, workspace requires workspaceId.
noteIdsNotracker_note_link: required note IDs to unlink.
projectIdNo
entityTypeYesWhat to trash.
operationIdNo
trackerEntryIdNotracker_note_link: required entry to detach notes from.
expectedRevisionNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real value beyond them: the operationId retry rule ('repeat in_progress with the same operationId'), partial_recovery conflict reporting, and the recovery path via penny_edit op:restore. It does not state permission/auth requirements or the shape of a partial_recovery response, which keeps it from a 5.

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

Conciseness4/5

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

The purpose is front-loaded and every fragment carries information, but the telegraphic, semicolon-chained style ('Project: projectId + expectedRevision + operationId') strains readability. No sentence is filler, yet a little more structure would aid parsing.

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 10-parameter, no-output-schema, destructive multi-entity tool, the description covers recovery, idempotent retry, conflict handling, and per-entity applicability. It leaves gaps on return values and on which entity types accept which of the remaining parameters, but overall it is enough to call the tool safely.

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?

At 70% schema coverage the schema carries much of the load, yet the description adds conditional requirements the schema does not encode (projectId + expectedRevision + operationId for projects; 'one id' for skill/rhythm; block names for profile_block; tag/link identifiers). Some content, such as max 100 and 'exactly one ID', duplicates the ids schema description.

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 opening 'Move to Trash' states a specific action (soft delete, not hard delete) on memory entities, and the description goes on to distinguish per-entity behavior. It explicitly contrasts itself with penny_edit for tasks and tracker definitions, so an agent can separate this from siblings like penny_edit and penny_write without opening their schemas.

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

Usage Guidelines5/5

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

It gives positive conditions (Project needs projectId + expectedRevision + operationId; tag/link removal uses the identifiers below) and explicit exclusions (tasks are canceled via penny_edit; tracker definitions are archived, not deleted). Alternatives are named rather than implied.

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

penny_editA
DestructiveIdempotent
Inspect

When the user corrects something on file, or a task, tracker, skill, or block needs to change, edit the existing item rather than writing a duplicate. Modify what already exists; entityType uses the same taxonomy as penny_write (see ladder). Notes: updates[] patch/replace, max100. Tasks: taskId; cancel via status:canceled, never Trash. Profile: blockName + content upsert; memory_policy and persona hold standing instructions. When the user tells you what to save, skip, check, or surface, update their memory_policy block in the same turn as a general rule in their words. Skill redefinition prepares a preview, not a save; wait for user approval before op:apply with proposalId. cancel discards; undo recovers the prior version if no later edit exists. skills/history supplies historyId; restore_revision with skillId/historyId/expectedUpdatedAt previews recovery. restore with skillId recovers deleted skills disabled. No invocation waiting period. Trackers: trackerId + sparse name/description/unit/kind/targetSpec/archived; retire by archiving, no delete. Private trackers only; workspace trackers unsupported. Rhythms: full manifest. skill_run/rhythm_run: complete runId + status. Projects: projectId + expectedRevision + operationId + sparse patch; reread and reconcile on conflict. restore_revision restores fields/resourceIds from historyId as a new revision. Tracker entries: trackerId + entryId + expectedUpdatedAt + full payload. restore un-trashes note/tracker_entry ids or Project projectId. When the user asks to go off the record, entityType: "session" + record: "off" + the sessionId from <mypenny-session> stops this session's transcript reaching Penny and drops what wasn't processed yet; it can't be undone for the session.

NameRequiredDescriptionDefault
opNorestore: un-trash notes/tracker entries by ids.
idsNorestore: IDs to un-trash; max 100.
goalNorhythm: required run instructions; skill uses instructions instead.
kindNotracker: habit|metric|goal|log|status|custom.
nameNoarea/project/tracker: name. entityType:"skill": previews replacement; rhythm: upserts.
unitNotracker: unit of measure.
actorNotask/area/project/heading: actor (me|agent) recorded in activity ledger.
notesNotask/area/project: markdown body.
orderNotask/area/project/heading: sort order.
orgIdNoarea/project/heading: required container ID to update.
ownerNotask: assignee.
patchNoProject patch: full schema on penny_write.
runIdNoskill_run/rhythm_run: required run ID to complete.
scopeNoProfile: global|workspace. Projects: private; workspace requires workspaceId.
titleNotask/heading: title/label.
areaIdNoproject: parent area.
fieldsNoRestore selection: field names or step:<stepId>; fields/resourceIds required.
recordNoentityType:"session" (required) — "off". One-way: there is no way back on for the session.
statusNotask: open|in_progress|done|canceled. Repeating completion returns nextTaskId: act on that new occurrence; the completed ID rejects further status writes. skill_run/rhythm_run: done|error|skipped.
taskIdNotask: ID to update.
whenAtNotask/project: schedule date (ms epoch).
contentNoprofile: required new block content.
deliverNoentityType:"skill": required with trigger; rhythm: required. Omit for on-demand. Shape: penny_write.
enabledNoskill: false pauses due signals, true resumes; requires skillId. Penny does not run skills.
entryIdNo
payloadNo
postureNoentityType:"skill" with trigger, or rhythm: read|propose|act.
skillIdNoskill: ID required with enabled to pause/resume.
triggerNoentityType:"skill": optional; rhythm: required. Omit to return to on-demand. Penny does not run it; connected agents receive due signals. Shape: penny_write. ALWAYS set IANA timezone; default UTC.
updatesNonote: patch or supersede up to 100 existing notes.
archivedNoArea/project/tracker: archive; false reactivates. Tracker definitions retire only this way.
deadlineNotask/project: hard due date (ms epoch).
snapshotNoskill restore_revision: history side; default before. after recovers an undone change.
agentNoteNo
blockNameNoprofile: required block to upsert.
dependsOnNotask: full prerequisite taskId set; replaces all.
historyIdNorestore_revision: Project/skill history ID. Skill restore previews; requires skillId and expectedUpdatedAt.
linkNotesNotask: note IDs to link.
projectIdNoheading: required parent Project.
sessionIdNoentityType:"session" — the transcript session to take off the record, from <mypenny-session>; omit when the host gives none.
trackerIdNotracker: required ID to update; only supplied fields change.
entityTypeYesItem type.
proposalIdNoReturned skill proposal. apply commits after user review; cancel discards; undo restores the previous version only if no later edit exists.
provenanceNorhythm_run: accountability summary (IDs/labels, never full content).
recordedAtNo
recurrenceNotask: set/change recurrence. clearFields:["recurrence"] ends the series, making the task one-off and preserving completed history. Target currentOccurrenceId, not a stale/completed ID.
targetSpecNotracker: replaces the whole target spec; shape as penny_write.
whenBucketNotask/project: undated bucket; mutually exclusive with whenAt.
clearFieldsNotask: optional fields to unset.
descriptionNoentityType:"skill"/rhythm: required use-when description. tracker: meaning; log trackers must document payload shape.
operationIdNoProject receipt key; identical retries only.
resourceIdsNoRestore selected links.
taskUpdatesNotask: edits, each {taskId, ...task fields} except card. All are checked first; one bad item saves none.
instructionsNoskill: required saved know-how; replaces rhythm goal.
retrievalPlanNoentityType:"skill"/rhythm: optional deterministic steps for a bounded tier.
expectedRevisionNoProject revision from Brief; reconcile conflicts.
expectedUpdatedAtNoSource version from read.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark the tool destructive and idempotent, and the description adds substantial context beyond them: skill redefinition previews require approval, cancel discards, undo only works if no later edit exists, project conflicts require rereading, private trackers only, and going off-record cannot be undone. These details materially improve safe invocation and do not contradict 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 the information density is high, which suits a 57-parameter tool. However, the body is a dense semicolon-separated run-on with cryptic fragments like 'Rhythms: full manifest' and 'No invocation waiting period', making it harder to scan than it needs to be.

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 highly complex destructive tool with no output schema, it covers the major entity types, operation modes, approval and undo behavior, conflict reconciliation, and session privacy semantics. It is strong overall, though some entity types such as areas and headings are left mostly to the schema, and return/error expectations are not described.

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 description coverage is 93%, so the baseline is 3, but the description adds useful entity-specific recipes such as updates[] patch/replace max 100, profile blockName + content upsert, skill preview via proposalId, and tracker entries requiring trackerId + entryId + expectedUpdatedAt + full payload. Some params remain vague or externally referenced, such as 'see ladder', and a few fields like agentNote and recordedAt are not clarified.

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: edit an existing item rather than writing a duplicate. It distinguishes itself from penny_write by naming the shared taxonomy, so an agent can tell this is the mutation/update path rather than creation.

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

Usage Guidelines5/5

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

It explicitly says when to edit instead of duplicating, then gives entity-specific triggers for tasks, trackers, skills, profiles, projects, rhythms, and sessions. It also names operation alternatives such as cancel, apply, undo, and restore_revision, so the agent has clear routing guidance.

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

penny_get_skillA
Read-onlyIdempotent
Inspect

Read the Penny operating skill (the SKILL.md penny_read target:skills name:Penny returns) or its reference files, including after a catalog refresh. Reuse files already read this conversation. Default SKILL.md; fetch manifest references when their cues apply. Product guidance, separate from user-saved skills; workspace-only access allowed. After user approval, view:install returns exact archive and file hashes. Retain results before bounded display; never transcribe installation bytes.

NameRequiredDescriptionDefault
fileNoExact manifest path; default SKILL.md; read view only.
viewNoDefault read. install returns an archive, not guidance.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent and closed-world, so the safety profile is covered. The description adds genuinely useful behavior: results should be cached rather than re-read, install returns an archive with exact hashes, and installation bytes must not be transcribed. However, cryptic constraints like 'bounded display' are unexplained, and leftover phrasing ('never transcribe installation bytes') lacks context an agent can act on.

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?

Efficient in length but densely packed with nested clauses and jargon; the opening parenthetical and 'bounded display' phrasing cost comprehension. The default-value and approval guidance is front-loaded reasonably well, but clarity suffers from cramming five distinct ideas into three sentences.

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 two-parameter, no-required-argument read tool with full schema coverage and annotations, the description covers scope, defaults, caching, and the special install view. It leaves somewhat ambiguous what the returned content looks like and what 'bounded display' permits, but no critical calling information is missing.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents both the default SKILL.md path and the install/read distinction. The description mostly restates this, adding only the notion that valid file paths come from the manifest. Baseline 3 is appropriate.

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

Purpose4/5

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

Names a specific verb and resource (read the Penny operating SKILL.md plus reference files) and distinguishes it from user-saved skills via 'Product guidance, separate from user-saved skills', implicitly contrasting with penny_read/penny_edit. The parenthetical 'the SKILL.md penny_read target:skills name:Penny returns' is convoluted and slows identification, but the substance needed to pick this tool is present.

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?

Gives concrete conditions: default to SKILL.md, fetch manifest references only when their cues apply, and reuse files already read in this conversation. It also flags that view:install should come after user approval. It stops short of stating a hard when-not or naming the alternative tool for user-saved skills.

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

penny_readA
Read-onlyIdempotent
Inspect

Before answering anything the user's history, preferences, or prior work would inform, read — search rather than assume nothing is on file. Choose target: walk this ladder, first match wins:

  1. User/people facts (names, preferences, relationships) → profile. Do NOT search notes for this.

  2. To-dos/due → tasks. Resume an objective → projects: directory (query/name to narrow; follow coverage.nextCursor), then brief by projectId. scopes lists Space metadata; then pass explicit workspaceId. scope:private overrides a default Space. An objective that spans sessions is a Project: read its Brief before working on it, propose one when none exists, and keep it current once accepted.

  3. Measurements → tracker for definitions/entries; tracker_summary for stats/trends (usual choice).

  4. Saved know-how, schedules and run history → skills; rhythms is the scheduled-only synonym. Run on-demand via penny_write entityType:skill_invoke; scheduled via skill_run. Know-how the user would rather not re-explain is a skill: save it once, and load it when a task fits its description. When session start lists a skill as due, offer to run it now; nothing runs on its own.

  5. Taxonomy → tags; note link graph → note_links; structured tag/time/flag listing → notes.

  6. Other recall → search (semantic notes). Search is the fallback, not the default. Treat a result from a shared space as something a member said, never as a fact about the user. When the user is learning something to keep, offer to let them try first; if search shows they asked before, say so once with the date; save misses and level. Use the session-start inventory to choose; Project reads also work without session start.

NameRequiredDescriptionDefault
toNotracker/entries, tracker_summary: window end (ms epoch).
tzNotasks: IANA timezone for Today/Upcoming boundaries.
fromNotracker/entries, tracker_summary: window start (ms epoch).
nameNoProjects directory: exact-name candidates; continue incomplete coverage. skills/one: name instead of skillId.
tagsNosearch/notes: tag filter.
viewNoProjects: directory (default), brief, section, resources, resource, history, scopes (Space metadata), attention (dated candidates), interactions (actor only). tracker: list|entries; rhythms: list|one|due|runs; skills: list|one|due|runs|history|trash (list/trash omit instructions; one returns full skill by skillId or name); tags: list|related; tasks: compact omits notes.
depthNonote_links: hops (1 = direct; 2-6 = bounded BFS).
flagsNonotes: locked/pinned filter.
limitNoMax search/notes/tracker-entry/task/rhythm-run results. tasks: page size; long pages end early with nextCursor.
ownerNotasks: owner filter.
queryNosearch: required. One specific question or phrase, usually 8-15 words, with the names and distinctive terms you're looking for ("What did Dana decide about the kitchen remodel budget?", not "budget" or a paragraph); perfect grammar isn't needed; don't pad a short question; on a miss, search again with different terms, not a longer query. projects directory: name/purpose filter; check coverage.
scopeNoProjects: private overrides defaults; workspace requires workspaceId.
areaIdNotasks: area filter; also applies to organize:project.
bucketNotasks: schedule bucket filter.
cursorNoprojects/tasks: prior nextCursor; keep the same filters. tasks: a page can be short and still have one; read until a reply has none.
statusNotasks: status filter.
targetYesWhat to read; first match in the tool description's ladder wins.
taskIdNotasks: full detail. A repeating task returns seriesId/currentOccurrenceId; act on the current occurrence, not a completed ID.
blockedNotasks: only tasks with unmet dependsOn.
sectionNoprojects/section: one Brief section.
seedIdsNonote_links: required starting note IDs.
skillIdNoskills: required for one unless name is given; optional run scope for runs.
dateAxisNonotes: timeRange axis; created = when written, valid = when the fact holds.
dueRangeNotasks: due-date window (ms epoch).
eventKeyNoProjects interactions: actor event key; omit to page.
maxDepthNotags/related: maximum traversal depth.
maxNodesNonote_links: node cap for depth > 1; default 50.
organizeNotasks: list containers instead of tasks.
rhythmIdNorhythms: required for one; optional run scope for runs.
seriesIdNotasks: complete recurring-series history, newest first, including completed occurrences.
edgeTypesNonote_links: only follow/return these relationship types.
minWeightNotags/related: minimum edge weight (default 0.4).
orgStatusNotasks organize:project: Project status filter.
projectIdNoprojects brief/section/resources/resource/history: required stable Project ID. tasks: Project filter or heading parent.
timeRangeNosearch/notes: time window (ms epoch).
trackerIdNoRequired for tracker/entries and tracker_summary.
blockNamesNoprofile: exact block names.
confidenceNonotes: confidence range.
ifRevisionNoprofile: last-read revision; returns {unchanged:true} if unchanged.
projectKeyNoprofile: include subconscious:<projectKey>.
resourceIdNoProjects resource: read the authorized current source.
enabledOnlyNorhythms/list: only enabled rhythms.
resourceStateNo
graphTraversalNosearch: opt into tag/link graph expansion (default false; measured recall loss). Use only for deliberate graph exploration.
includeArchivedNoInclude archived trackers, Projects, or task containers.
includeCompletedNotasks: include done/canceled; default false. An explicit status wins.
includeRelationsNotags/list: include parents/children/synonyms.
legacyProjectKeyNoprofile: coding-plugin migration aid — the same repo's older key, served in place of subconscious:<projectKey> until that exists.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, and the description adds real behavioral context beyond them: shared-space results must be treated as a member's statement rather than a user fact, nothing runs on its own, Project reads work without session start, and on a search miss you should re-query with different terms rather than lengthen the query. It stops short of describing what a read actually returns (result shape, size), which matters given there is no output schema.

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 numbered ladder is well front-loaded and scannable, but the text also carries agent policy that does not help select or invoke this tool ("offer to let them try first", "say so once with the date", "save misses and level"). For a single read entry point, roughly a third of the prose is behavioural coaching layered onto a 48-parameter router, which dilutes the selection signal.

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 48-parameter multi-target router, the description is unusually complete on the routing axis: it covers every target in the enum, states the two cursor/pagination cases (coverage.nextCursor, nextCursor) and the private-vs-workspace scope rule. The gap is on the output side — with no output schema and eleven distinct result shapes, nothing tells the agent what each target returns, so the schema and description together still leave returns opaque.

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 98%, so the baseline would be 3, but the description adds routing meaning the schema cannot: it explains which target a parameter belongs to conceptually ("note link graph → note_links", "structured tag/time/flag listing → notes") and clarifies precedence such as scope:private overriding a default Space. It also flags the usual default (tracker_summary for stats/trends), which is selection guidance rather than restatement.

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 the verb (read/search) and then enumerates exactly what can be read via a six-step ladder mapped onto the `target` enum (profile, projects, tasks, tracker, skills, tags, note_links, notes, search). It distinguishes itself from siblings by naming penny_write, skill_run and penny_session_start as the write/run paths, so an agent can tell a read from a mutation without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit first-match-wins decision ladder plus hard exclusions ("Do NOT search notes for this", "Search is the fallback, not the default") and names the alternative for each branch (tracker_summary over tracker for stats, rhythms over skills for scheduled-only). It also states a prerequisite gate — read before answering anything the user's history would inform — which is exactly the when-to-use signal an agent needs.

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

penny_session_startA
Read-onlyIdempotent
Inspect

Call ONCE at the start of every conversation, before the first substantive reply. If the host saves this result to a file because it is too large, read the whole file before you reply. Retain results in execution storage before bounded display; inspect one text OR structured payload. Follow next[] in order; it starts with reading the Penny skill. Reuse the complete, untruncated profile (persona/facts/preferences/custom blocks) and answer from it before searching notes. Follow self_improvement throughout the conversation. meta.onboarding present: offer penny_start_setup, resuming from its phase. meta.saveDrought true: follow drought repair. Inventories of trackers, rhythms, tasks and Projects are capped; meta.truncated.* means drill down with penny_read. skills.defined names every user-saved skill (read one with penny_read target:skills view:one before using it); it excludes the built-in Penny skill. features says which features are in use and when; consult it and the inventory before choosing entityType. tz is IANA (default UTC) for local Today/Overdue and dueNow. projects is a bounded PRIVATE directory with coverage and dated attention candidates, not a search of all Spaces; read relevant Briefs by projectId. Workspace-only connections cannot call this: use penny_read target:projects view:scopes, then explicit workspaceId. projectKey includes only the matching repository subconscious block, not a Penny Project.

NameRequiredDescriptionDefault
tzNoIANA timezone for today/overdue boundaries (e.g. America/New_York); default UTC.
projectKeyNoInclude subconscious:<projectKey>; exclude all other subconscious blocks.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses important behaviors: large results may be saved to a file, results should be retained in execution storage before bounded display, next[] must be followed in order, and the complete profile should be reused before searching notes. It also explains special metadata flags such as meta.onboarding, meta.saveDrought, and meta.truncated.*, along with workspace-only invocation limits. These are substantial behavioral details that annotations alone do not provide.

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 most important instruction, calling once at the start before replying, is front-loaded. However, the description is a dense single paragraph with many compact clauses and cryptic field references, making it harder to scan than necessary. It is information-rich but would benefit from clearer separation of invocation rules, output handling, and metadata semantics.

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

Completeness5/5

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

For a tool with no output schema and two optional parameters, the description covers the important context: what the session payload contains, how to handle large results, how next[] should be followed, how truncated inventories should be drilled into, and how special metadata flags should alter behavior. It also documents workspace restrictions and the distinction between projectKey and Penny Projects. That is complete enough 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.

Parameters4/5

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

Schema coverage is 100%, so the schema already documents both optional parameters. The description still adds useful meaning: tz controls local Today/Overdue and dueNow boundaries, and projectKey includes only the matching repository subconscious block while explicitly not representing a Penny Project. It also clarifies the workspace-only limitation around project-scoped access, which is more than the schema alone conveys.

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

Purpose4/5

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

The description makes clear that this is a session-start bootstrap that returns a reusable profile, inventories, next steps, and metadata, rather than a general read tool. It distinguishes itself from siblings by directing drill-downs to penny_read and onboarding to penny_start_setup. A direct one-line statement of the returned payload would make the purpose unmistakable, but the overall intent is easily inferable.

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

Usage Guidelines5/5

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

It explicitly says to call this ONCE at the start of every conversation before the first substantive reply. It also names alternatives and exclusions: use penny_read for truncated inventories or skills, offer penny_start_setup when meta.onboarding is present, and use penny_read target:projects view:scopes for workspace-only connections. This leaves little ambiguity about when and when not to invoke it.

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

penny_start_setupC
Idempotent
Inspect

Setup in phases; omit phase to start, resume from meta.onboarding.phase. skipForGood opts out. Stage an encrypted import, show showUser, then save or discard as the user says. While an import is open, finish can't complete setup.

NameRequiredDescriptionDefault
stopNoTour stop, with phase tour.
phaseNoPhase to run; omit to start.
clientNoActual host: claude-desktop, claude-web, claude-code, codex, chatgpt, gemini, perplexity, grok (web only), grok-bot or other; tailors paste guidance.
countsNoCumulative answers/featuresCreated. Ledger imports ignore imported; only committed receipts count.
draftIdNoReturned draft ID.
dropItemIdsNosave: dropped ids (values of items).
importDraftNoStrict JSON {notes,profiles}; returned schema. 10 notes, 4 replacements, 64 KiB UTF-8.
keepItemIdsNosave: left-out ids the user kept.
skipForGoodNoUser requested permanent setup opt-out.
importActionNoAll but status need draftId and expectedRevision; stage also importDraft. status re-sends the list.
prevAcceptedNoDid the user accept the previous tour stop's offer?
expectedRevisionNoReturned revision.

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare non-read-only, idempotent, non-destructive, closed-world, so the description adds value via the sequencing constraint ("while an import is open, finish can't complete setup") and the encrypted-import staging flow, which are genuine behavioral facts. It still leaves unclear what persisting side effects phases like finish, gaps or skipForGood produce, and 'discard' silently dropping a staged import sits in mild tension with destructiveHint=false.

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?

Four short sentences with little filler and the invocation rule front-loaded, which is efficient. However the telegraphic style ("skipForGood opts out", "show showUser") packs jargon without explaining it, so brevity comes at the cost of parseability.

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

Completeness2/5

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

For a 12-parameter, five-phase state machine with nested objects and no output schema, the description is thin: it does not explain what the gaps or tour phases do, what stop/prevAccepted drive, how counts/ledger imports behave, or what each phase returns. Given the completeness burden this complex a tool places on the description, material gaps remain.

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

Parameters3/5

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

Schema coverage is 100%, including enums for phase and importAction and inline notes on expectedRevision and importDraft limits, which sets the baseline at 3. The description largely restates schema facts (omit phase to start, skipForGood opts out) and adds no new meaning for draftId, counts, stop, prevAccepted, or the keep/drop item ID pairs.

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

Purpose3/5

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

The description frames a phased onboarding state machine ("Setup in phases", "omit phase to start, resume from meta.onboarding.phase") so an agent can infer it drives setup progression, but it never states plainly what the tool does at the top level (start onboarding, run a phase, or manage an import draft). Terms like "showUser" and "meta.onboarding.phase" are undefined and the verb/resource pairing is vague.

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

Usage Guidelines3/5

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

It gives real invocation guidance: omit phase to start, resume from meta.onboarding.phase, skipForGood opts out, and the import sequence stage -> show -> save/discard. It offers no differentiation from the siblings (penny_session_start, penny_write, penny_read), so an agent has no cue about when to pick this over starting a session.

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

penny_writeAInspect

Save the moment something durable emerges — a decision, preference, plan, correction, a to-do, a measurement, or something you produced — mid-conversation and unprompted; when the call is close, save. Choose entityType: walk this ladder, first match wins:

  1. Durable fact about the user or their people → update the profile (profile upsert or penny_edit), not a note. How they want to be remembered → memory_policy, a general rule in their words; how they want you to show up (tone/register/manner) → persona. When the user tells you what to save, skip, check, or surface, update their memory_policy block in the same turn as a general rule in their words.

  2. Commitment/action with a done-state → task. Organize via area/project/heading. A to-do the user mentions, even in passing, is a task: offer to capture it, then write it. Project create: patch.name/purpose + operationId; revise: projectId + expectedRevision from Brief + sparse patch (max 25 step/resource changes). project_interaction records actor proposals/declines/deferrals. pending_share_approval is a proposal, not a save. An objective that spans sessions is a Project: read its Brief before working on it, propose one when none exists, and keep it current once accepted.

  3. Measurement → tracker_entry for an existing tracker (check inventory); otherwise propose tracker first. Active duplicate tracker names are rejected; edit with penny_edit. A measurement the user would log more than once is a tracker entry; if no tracker fits, propose one before logging.

  4. Reusable know-how → skill; trigger makes it scheduled (legacy rhythm). Existing skill names prepare a preview; wait for user approval before penny_edit op:apply with proposalId. Run on-demand via skill_invoke; begin scheduled runs via skill_run. Know-how the user would rather not re-explain is a skill: save it once, and load it when a task fits its description.

  5. Other context/events/ideas/learning → note. Prefer a specific type when unsure; a note is the fallback, not the default. When the user is learning something to keep, offer to let them try first; if search shows they asked before, say so once with the date; save misses and level. If so, read penny_get_skill references/learning.md. Also tag_relation and tracker_note_link. Batch notes or tracker_entry entries: max100. Modify existing items with penny_edit; trash with penny_delete. Reuse an existing tag before minting a new one. Tagging and linking conventions live in the Penny skill.

Note confidence measures signal, not pipeline: 0.95 = explicit user statement; 0.80 = confirmed decision; 0.60 = reasonable inference; 0.40 = hedged or sleeptime-derived; 0.20 = weak signal. Each note needs sampleQuestions: exactly three short, distinct natural-language questions derived from its content, in the user's voice, not keywords or near-duplicates. For an APA preference: ["What citation style should I use for the paper?", "How should I format references in my thesis?", "What’s my usual academic style?"].

NameRequiredDescriptionDefault
goalNorhythm: required run instructions; skill uses instructions instead.
kindNotracker: required; habit|metric|goal|log|status|custom.
nameNoRequired: tracker/area/project/rhythm and entityType:"skill". skill_invoke/skill_run: alternative to skillId. Existing skill names preview changes; new names create. Active tracker duplicates are rejected; archived names reactivate.
tagsNotask: tags to attach.
unitNotracker: unit of measure.
actorNotask/area/project/heading: actor (me|agent) recorded in activity ledger.
childNotag_relation: required child tag.
notesNonote: array (max 100), each requires content and confidence (0–1), plus tags and exactly 3 sampleQuestions in the user’s voice; optional source/memoryType (episodic|semantic|procedural)/validFrom. task/area/project: markdown string.
orderNotask/area/project/heading: sort order.
ownerNotask: assignee.
patchNoProject: sparse changes; omitted fields stay. Max 25 step/resource changes.
scopeNoProfile: global|workspace. Projects: private; workspace requires workspaceId.
titleNotask/heading: required title/label.
areaIdNoproject: required parent area.
parentNotag_relation: required parent tag of child_of edge.
sourceNonote/tracker_entry: provenance; defaults conversation/agent-mcp respectively.
statusNotask: initial status.
whenAtNotask/project: schedule date (ms epoch).
contentNoprofile: required block content.
deliverNoentityType:"skill": required with trigger; rhythm: required. Omit for on-demand. Scheduled output: {kind:'note',tags?:string[]}|{kind:'profile_block',blockName:string}|{kind:'notify'}.
entriesNotracker_entry: up to 100 for one trackerId; each {payload,loggedAt?,agentNote?,noteIds?,source?,metadata?,externalId?}. Mutually exclusive with top-level payload. Receipts list saved/failed items and duplicates for stored externalIds; do not claim all saved from a partial result.
noteIdsNotracker_entry: archival note IDs to attach. tracker_note_link: required note IDs to link.
payloadNotracker_entry: tracker-defined data point; required unless entries is used.
postureNoentityType:"skill" with trigger, or rhythm: read|propose|act; default read.
skillIdNoskill_invoke/skill_run: skill to run now/begin; required unless name is given.
triggerNoentityType:"skill": optional; rhythm: required. Requires deliver. Penny does not run it; due signals reach the connected agent. Schedule: {kind:"schedule",cadence:"daily"|"weekly"|"monthly",at?:"Fri 16:00",timezone?:"America/Denver"}. ALWAYS set IANA timezone; default UTC shifts local times. Event: {kind:"event",on:"note.created",where?:{tags?:string[]}}.
deadlineNotask/project: hard due date (ms epoch).
rhythmIdNorhythm_run: rhythm to begin; or pass name.
agentNoteNotracker_entry, single only: short non-searchable caption.
blockNameNoprofile: required block name to upsert.
dependsOnNotask: full prerequisite taskId set; replaces all.
headingIdNotask: parent heading.
linkNotesNotask: note IDs to link.
projectIdNotask: parent Project. heading: required parent Project.
reasoningNotag_relation: short edge justification, typically a user quote.
trackerIdNotracker_entry: required tracker to log against.
entityTypeYesWhat to create; first match in the tool description's ladder wins.
externalIdNotracker_entry, also entries items: source record ID, max 200 chars. Use for imports/sync: repeats on the same tracker return the existing entry as duplicate. Opaque, unencrypted: never include content.
recordedAtNotracker_entry, single only: observation time (ms epoch); default now.
recurrenceNotask: repeat. Returned taskId is the first occurrence; completion returns nextTaskId (see penny_edit status). Never reuse a completed occurrence's ID.
targetSpecNotracker: JSON target spec, interpreted at retrieval (e.g. {kind:'daily_minimum',value:10000}).
whenBucketNotask/project: undated bucket; mutually exclusive with whenAt.
descriptionNotracker: required meaning. entityType:"skill"/rhythm: required one-line purpose, including on-demand skills.
interactionNoproject_interaction: actor decision; read first, update with expectedUpdatedAt.
operationIdNoProject receipt key; identical retries only.
instructionsNoskill: required know-how for invocation or when a connected agent picks up a due skill. Replaces rhythm goal.
retrievalPlanNoentityType:"skill"/rhythm: optional deterministic steps [{tool,args}] for a bounded tier.
trackerEntryIdNotracker_note_link: required entry to attach notes to.
expectedRevisionNoProject revision from Brief; reconcile conflicts.
expectedUpdatedAtNoSource version from read.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already establish that this is a write tool, but the description adds substantial behavioral context: batch limits of 100, duplicate handling, tracker receipts, skill preview/approval flow, task recurrence return behavior, project revision conflicts, and confidence scoring semantics. These are concrete operational traits beyond 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 description is front-loaded and uses a numbered ladder for structure, but it is very dense, includes duplicated schema detail, and contains long run-on clauses. The complexity justifies some length, but several details could be tightened without losing invocation guidance.

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

Completeness4/5

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

Given a 50-parameter omnibus tool with no output schema, the description covers the major workflows, constraints, and return-relevant behaviors such as duplicates and task recurrence. It still does not fully explain return behavior or every entity type, but schema coverage and annotations make it sufficiently complete for invocation.

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 schema already documents parameters extensively. The description adds crucial meaning beyond the schema by providing the entityType selection ladder and mapping each entity type to the relevant workflow and parameters, though it does not add semantics for all 50 parameters.

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 action—save durable information mid-conversation—and defines the resource scope through an explicit entityType ladder. It also distinguishes the tool from siblings by naming penny_edit for modifications, penny_delete for trashing, and other alternatives for profiles, trackers, skills, and notes.

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

Usage Guidelines5/5

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

It gives extensive when-to-use guidance: save when something durable emerges and the call is close, follow the first-match entityType ladder, prefer specific types over notes, check tracker inventory, propose trackers when missing, and use penny_edit or penny_delete instead of penny_write for modifications/removals. It also names exceptions such as pending_share_approval being a proposal, not a save.

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

Tool Schema Changelog

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

  1. 1 tool update
    • Changedpenny_start_setup1 field changed
      • changedInput schema / properties / client / description
        Previous value: -"Actual host: claude-desktop, claude-web, claude-code, codex, chatgpt, gemini, perplexity or other; tailors paste guidance."New value: +"Actual host: claude-desktop, claude-web, claude-code, codex, chatgpt, gemini, perplexity, grok (web only), grok-bot or other; tailors paste guidance."
  2. 1 tool update
    • Changedpenny_start_setup1 field changed
      • changedInput schema / properties / client / description
        Previous value: -"Actual host: claude-desktop, claude-code, codex, chatgpt or other; tailors paste guidance."New value: +"Actual host: claude-desktop, claude-web, claude-code, codex, chatgpt, gemini, perplexity or other; tailors paste guidance."
  3. 2 tool updates
    • Changedpenny_read1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"search: required semantic query. projects directory: name/purpose filter; check coverage."New value: +"search: required. One specific question or phrase, usually 8-15 words, with the names and distinctive terms you're looking for (\"What did Dana decide about the kitchen remodel budget?\", not \"budget\" or a paragraph); perfect grammar isn't needed; don't pad a short question; on a miss, search again with different terms, not a longer query. projects directory: name/purpose filter; check coverage."
    • Changedpenny_session_start4 fields changed
      • removedInput schema / properties / installedSkillSha256
        Removed value: -{
        -  "description": "Exact metadata.bundle_sha256; report absent metadata as unversioned.",
        -  "type": "string"
        -}
      • removedInput schema / properties / installedSkillSource
        Removed value: -{
        -  "description": "Manage plugin copies via plugin manager; standalone via approved archive installation.",
        -  "enum": [
        -    "standalone",
        -    "plugin",
        -    "unsupported",
        -    "unknown"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / installedSkillStatus
        Removed value: -{
        -  "description": "Read installed skill, then report. Legacy omission returns not_reported.",
        -  "enum": [
        -    "versioned",
        -    "unversioned",
        -    "missing"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / installedSkillVersion
        Removed value: -{
        -  "description": "Exact installed metadata.version; omit if missing or unversioned.",
        -  "type": "string"
        -}
  4. 2 tool updates
    • Changedpenny_edit5 fields changed
      • changedInput schema / properties / entityType / enum
        Previous value: -[
        -  "profile",
        -  "task",
        -  "area",
        -  "project",
        -  "heading",
        -  "tracker",
        -  "rhythm",
        -  "rhythm_run",
        -  "skill",
        -  "skill_run",
        -  "note",
        -  "tracker_entry"
        -]New value: +[
        +  "profile",
        +  "task",
        +  "area",
        +  "project",
        +  "heading",
        +  "tracker",
        +  "rhythm",
        +  "rhythm_run",
        +  "skill",
        +  "skill_run",
        +  "note",
        +  "tracker_entry",
        +  "session"
        +]
      • addedInput schema / properties / record
        Added value: +{
        +  "description": "entityType:\"session\" (required) — \"off\". One-way: there is no way back on for the session.",
        +  "enum": [
        +    "off"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / sessionId
        Added value: +{
        +  "description": "entityType:\"session\" — the transcript session to take off the record, from <mypenny-session>; omit when the host gives none.",
        +  "type": "string"
        +}
      • changedInput schema / properties / taskId / description
        Previous value: -"task: required ID to update."New value: +"task: ID to update."
      • addedInput schema / properties / taskUpdates
        Added value: +{
        +  "description": "task: edits, each {taskId, ...task fields} except card. All are checked first; one bad item saves none.",
        +  "items": {
        +    "type": "object"
        +  },
        +  "maxItems": 100,
        +  "type": "array"
        +}
    • Changedpenny_read1 field changed
      • addedInput schema / properties / legacyProjectKey
        Added value: +{
        +  "description": "profile: coding-plugin migration aid — the same repo's older key, served in place of subconscious:<projectKey> until that exists.",
        +  "type": "string"
        +}
  5. 1 tool update
    • Changedpenny_start_setup7 fields changed
      • changedInput schema / properties / draftId / description
        Previous value: -"Returned collection ID; stage only."New value: +"Returned draft ID."
      • addedInput schema / properties / dropItemIds
        Added value: +{
        +  "description": "save: dropped ids (values of items).",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / expectedRevision / description
        Previous value: -"Returned revision; stage only."New value: +"Returned revision."
      • changedInput schema / properties / importAction / description
        Previous value: -"Stage needs importDraft, draftId, expectedRevision. Status has no content. No model approval."New value: +"All but status need draftId and expectedRevision; stage also importDraft. status re-sends the list."
      • changedInput schema / properties / importAction / enum
        Previous value: -[
        -  "stage",
        -  "status"
        -]New value: +[
        +  "stage",
        +  "status",
        +  "save",
        +  "discard"
        +]
      • changedInput schema / properties / importDraft / description
        Previous value: -"Strict JSON {notes,profiles}; returned schema. 10 notes, 4 replacements, 64 KiB UTF-8. No approval/source/selection."New value: +"Strict JSON {notes,profiles}; returned schema. 10 notes, 4 replacements, 64 KiB UTF-8."
      • addedInput schema / properties / keepItemIds
        Added value: +{
        +  "description": "save: left-out ids the user kept.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  6. 1 tool update
    • Changedpenny_read4 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Project cursor; retain view/scope."New value: +"projects/tasks: prior nextCursor; keep the same filters. tasks: a page can be short and still have one; read until a reply has none."
      • changedInput schema / properties / includeCompleted / description
        Previous value: -"tasks: include done/canceled; default false."New value: +"tasks: include done/canceled; default false. An explicit status wins."
      • changedInput schema / properties / limit / description
        Previous value: -"Max search/notes/tracker-entry/task/rhythm-run results."New value: +"Max search/notes/tracker-entry/task/rhythm-run results. tasks: page size; long pages end early with nextCursor."
      • changedInput schema / properties / view / description
        Previous value: -"Projects: directory (default), brief, section, resources, resource, history, scopes (Space metadata), attention (dated candidates), interactions (actor only). tracker: list|entries; rhythms: list|one|due|runs; skills: list|one|due|runs|history|trash (list/trash omit instructions; one returns full skill by skillId or name); tags: list|related."New value: +"Projects: directory (default), brief, section, resources, resource, history, scopes (Space metadata), attention (dated candidates), interactions (actor only). tracker: list|entries; rhythms: list|one|due|runs; skills: list|one|due|runs|history|trash (list/trash omit instructions; one returns full skill by skillId or name); tags: list|related; tasks: compact omits notes."
  7. 7 tool updates
    • Changedpenny_delete5 fields changed
      • changedInput schema / properties / ids / description
        Previous value: -"entityType:\"note\"/\"tracker_entry\" — ids to trash (max 100); \"rhythm\"/\"skill\" — exactly one id; \"profile_block\" — block names to trash."New value: +"note/tracker_entry: IDs to trash, max 100. rhythm/skill: exactly one ID. profile_block: block names to trash."
      • changedInput schema / properties / noteIds / description
        Previous value: -"entityType:\"tracker_note_link\" (required) — the notes to unlink."New value: +"tracker_note_link: required note IDs to unlink."
      • changedInput schema / properties / tagA / description
        Previous value: -"entityType:\"tag_relation\" (required) — one endpoint of the edge to remove."New value: +"tag_relation: required edge endpoint to remove."
      • changedInput schema / properties / tagB / description
        Previous value: -"entityType:\"tag_relation\" (required) — the other endpoint."New value: +"tag_relation: required other endpoint."
      • changedInput schema / properties / trackerEntryId / description
        Previous value: -"entityType:\"tracker_note_link\" (required) — the entry to detach notes from."New value: +"tracker_note_link: required entry to detach notes from."
    • Changedpenny_edit42 fields changed
      • changedInput schema / properties / actor / description
        Previous value: -"entityType:\"task\"/\"area\"/\"project\"/\"heading\" — who took the action (me|agent), written to the activity ledger."New value: +"task/area/project/heading: actor (me|agent) recorded in activity ledger."
      • changedInput schema / properties / areaId / description
        Previous value: -"entityType:\"project\" — the area the project belongs to."New value: +"project: parent area."
      • changedInput schema / properties / blockName / description
        Previous value: -"entityType:\"profile\" (required) — the profile block to upsert."New value: +"profile: required block to upsert."
      • changedInput schema / properties / clearFields / description
        Previous value: -"entityType:\"task\" — names of optional fields to UNSET on the task."New value: +"task: optional fields to unset."
      • changedInput schema / properties / content / description
        Previous value: -"entityType:\"profile\" (required) — the new block content."New value: +"profile: required new block content."
      • changedInput schema / properties / deadline / description
        Previous value: -"entityType:\"task\"/\"project\" — hard due date (ms epoch)."New value: +"task/project: hard due date (ms epoch)."
      • changedInput schema / properties / deliver / description
        Previous value: -"entityType:\"skill\": required with trigger (also rhythm); omit for on-demand. See penny_write for shape."New value: +"entityType:\"skill\": required with trigger; rhythm: required. Omit for on-demand. Shape: penny_write."
      • changedInput schema / properties / dependsOn / description
        Previous value: -"entityType:\"task\" — full replacement set of taskIds that must complete first."New value: +"task: full prerequisite taskId set; replaces all."
      • changedInput schema / properties / description / description
        Previous value: -"entityType:\"skill\": REQUIRED use-when description; also rhythm. tracker: meaning; log trackers must document payload shape."New value: +"entityType:\"skill\"/rhythm: required use-when description. tracker: meaning; log trackers must document payload shape."
      • changedInput schema / properties / enabled / description
        Previous value: -"entityType:\"skill\": false pauses due signals, true resumes; requires skillId. Penny does not run skills."New value: +"skill: false pauses due signals, true resumes; requires skillId. Penny does not run skills."
      • changedInput schema / properties / expectedRevision / description
        Previous value: -"Project edit revision from Brief; reconcile conflicts."New value: +"Project revision from Brief; reconcile conflicts."
      • changedInput schema / properties / expectedUpdatedAt / description
        Previous value: -"Source version from the read."New value: +"Source version from read."
      • changedInput schema / properties / goal / description
        Previous value: -"entityType:\"rhythm\" (required) — what the run should do. On entityType:\"skill\" this is `instructions`."New value: +"rhythm: required run instructions; skill uses instructions instead."
      • changedInput schema / properties / historyId / description
        Previous value: -"restore_revision: Project history item or skill history item. Skill restoration prepares a preview; requires skillId and expectedUpdatedAt."New value: +"restore_revision: Project/skill history ID. Skill restore previews; requires skillId and expectedUpdatedAt."
      • changedInput schema / properties / ids / description
        Previous value: -"op:\"restore\" — ids to un-trash (max 100)."New value: +"restore: IDs to un-trash; max 100."
      • changedInput schema / properties / instructions / description
        Previous value: -"entityType:\"skill\" (required) — the saved know-how (generalizes the rhythm \"goal\")."New value: +"skill: required saved know-how; replaces rhythm goal."
      • changedInput schema / properties / kind / description
        Previous value: -"entityType:\"tracker\" — habit | metric | goal | log | status | custom."New value: +"tracker: habit|metric|goal|log|status|custom."
      • changedInput schema / properties / linkNotes / description
        Previous value: -"entityType:\"task\" — note ids to link to this task."New value: +"task: note IDs to link."
      • changedInput schema / properties / name / description
        Previous value: -"Area/project/tracker name; entityType:\"skill\" names prepare a preview of the replacement (rhythm names upsert)."New value: +"area/project/tracker: name. entityType:\"skill\": previews replacement; rhythm: upserts."
      • changedInput schema / properties / notes / description
        Previous value: -"entityType:\"task\"/\"area\"/\"project\" — markdown body."New value: +"task/area/project: markdown body."
      • changedInput schema / properties / op / description
        Previous value: -"op:\"restore\" un-trashes notes or tracker entries by `ids`."New value: +"restore: un-trash notes/tracker entries by ids."
      • changedInput schema / properties / order / description
        Previous value: -"entityType:\"task\"/\"area\"/\"project\"/\"heading\" — sort order."New value: +"task/area/project/heading: sort order."
      • changedInput schema / properties / orgId / description
        Previous value: -"entityType:\"area\"/\"project\"/\"heading\" (required) — the container to update."New value: +"area/project/heading: required container ID to update."
      • changedInput schema / properties / owner / description
        Previous value: -"entityType:\"task\" — assignee."New value: +"task: assignee."
      • changedInput schema / properties / posture / description
        Previous value: -"entityType:\"skill\" with a `trigger` set (or legacy \"rhythm\") — read | propose | act."New value: +"entityType:\"skill\" with trigger, or rhythm: read|propose|act."
      • changedInput schema / properties / projectId / description
        Previous value: -"entityType:\"heading\" (required) — the project the heading belongs to."New value: +"heading: required parent Project."
      • changedInput schema / properties / proposalId / description
        Previous value: -"Skill change proposal returned by an edit. op:apply commits after user review; cancel discards; undo restores the previous version if no later edit exists."New value: +"Returned skill proposal. apply commits after user review; cancel discards; undo restores the previous version only if no later edit exists."
      • changedInput schema / properties / provenance / description
        Previous value: -"entityType:\"rhythm_run\" — accountability summary of what the run did (ids/labels, never full content)."New value: +"rhythm_run: accountability summary (IDs/labels, never full content)."
      • changedInput schema / properties / retrievalPlan / description
        Previous value: -"entityType:\"skill\" (or legacy \"rhythm\") — OPTIONAL deterministic steps for a bounded tier."New value: +"entityType:\"skill\"/rhythm: optional deterministic steps for a bounded tier."
      • changedInput schema / properties / runId / description
        Previous value: -"entityType:\"skill_run\" (required) — the run to complete; same field on the legacy \"rhythm_run\"."New value: +"skill_run/rhythm_run: required run ID to complete."
      • changedInput schema / properties / skillId / description
        Previous value: -"entityType:\"skill\" pause/resume — the skill id (required with enabled)."New value: +"skill: ID required with enabled to pause/resume."
      • changedInput schema / properties / snapshot / description
        Previous value: -"Skill restore_revision: which side of the history entry to restore (default before). Select after to recover a change that was undone."New value: +"skill restore_revision: history side; default before. after recovers an undone change."
      • changedInput schema / properties / taskId / description
        Previous value: -"entityType:\"task\" (required) — the task to update."New value: +"task: required ID to update."
      • changedInput schema / properties / title / description
        Previous value: -"entityType:\"task\"/\"heading\" — the title/label."New value: +"task/heading: title/label."
      • changedInput schema / properties / trackerId / description
        Previous value: -"entityType:\"tracker\" (required) — the tracker to update. Only the fields you pass are patched — omit any you don't want to change."New value: +"tracker: required ID to update; only supplied fields change."
      • changedInput schema / properties / trigger / description
        Previous value: -"entityType:\"skill\": optional (required for rhythm). Omit to return to on-demand. Penny does not run it; the connected agent receives due signals. See penny_write for shape; ALWAYS set IANA timezone, default UTC."New value: +"entityType:\"skill\": optional; rhythm: required. Omit to return to on-demand. Penny does not run it; connected agents receive due signals. Shape: penny_write. ALWAYS set IANA timezone; default UTC."
      • changedInput schema / properties / unit / description
        Previous value: -"entityType:\"tracker\" — unit of measure."New value: +"tracker: unit of measure."
      • changedInput schema / properties / updates / description
        Previous value: -"entityType:\"note\" — patch or supersede existing notes (up to 100)."New value: +"note: patch or supersede up to 100 existing notes."
      • changedInput schema / properties / updates / items / properties / content / description
        Previous value: -"Required when mode is \"patch\"."New value: +"Required for patch."
      • changedInput schema / properties / updates / items / properties / supersededBy / description
        Previous value: -"Required when mode is \"replace\" — the id of the note that replaces this one."New value: +"replace: required replacement note ID."
      • changedInput schema / properties / whenAt / description
        Previous value: -"entityType:\"task\"/\"project\" — schedule date (ms epoch)."New value: +"task/project: schedule date (ms epoch)."
      • changedInput schema / properties / whenBucket / description
        Previous value: -"entityType:\"task\"/\"project\" — undated bucket; mutually exclusive with whenAt."New value: +"task/project: undated bucket; mutually exclusive with whenAt."
    • Changedpenny_get_skill2 fields changed
      • changedInput schema / properties / file / description
        Previous value: -"Exact manifest path, default SKILL.md; read view only."New value: +"Exact manifest path; default SKILL.md; read view only."
      • changedInput schema / properties / view / description
        Previous value: -"Default read. Install returns an archive, not readable guidance."New value: +"Default read. install returns an archive, not guidance."
    • Changedpenny_read31 fields changed
      • changedInput schema / properties / areaId / description
        Previous value: -"target:\"tasks\" — filter by area, or organize=\"project\" filter."New value: +"tasks: area filter; also applies to organize:project."
      • changedInput schema / properties / blocked / description
        Previous value: -"target:\"tasks\" — restrict to tasks with unmet dependsOn."New value: +"tasks: only tasks with unmet dependsOn."
      • changedInput schema / properties / bucket / description
        Previous value: -"target:\"tasks\" — filter by schedule bucket."New value: +"tasks: schedule bucket filter."
      • changedInput schema / properties / dateAxis / description
        Previous value: -"target:\"notes\" — which date timeRange filters ('created' = when written, 'valid' = when the fact holds)."New value: +"notes: timeRange axis; created = when written, valid = when the fact holds."
      • changedInput schema / properties / depth / description
        Previous value: -"target:\"note_links\" — hops to expand (1 = direct links; 2-6 = bounded BFS)."New value: +"note_links: hops (1 = direct; 2-6 = bounded BFS)."
      • changedInput schema / properties / dueRange / description
        Previous value: -"target:\"tasks\" — due-date window (ms epoch)."New value: +"tasks: due-date window (ms epoch)."
      • changedInput schema / properties / edgeTypes / description
        Previous value: -"target:\"note_links\" — only follow/return edges of these relationship types."New value: +"note_links: only follow/return these relationship types."
      • changedInput schema / properties / enabledOnly / description
        Previous value: -"target:\"rhythms\" view:\"list\" — only enabled rhythms."New value: +"rhythms/list: only enabled rhythms."
      • changedInput schema / properties / from / description
        Previous value: -"target:\"tracker\" entries / tracker_summary — start of window (ms epoch)."New value: +"tracker/entries, tracker_summary: window start (ms epoch)."
      • changedInput schema / properties / ifRevision / description
        Previous value: -"profile: the revision from your last read; returns {unchanged:true} if nothing changed."New value: +"profile: last-read revision; returns {unchanged:true} if unchanged."
      • changedInput schema / properties / includeCompleted / description
        Previous value: -"target:\"tasks\" — include done/canceled tasks (default false)."New value: +"tasks: include done/canceled; default false."
      • changedInput schema / properties / limit / description
        Previous value: -"Max results. Applies to search, notes, tracker entries, tasks, and rhythm runs."New value: +"Max search/notes/tracker-entry/task/rhythm-run results."
      • changedInput schema / properties / maxNodes / description
        Previous value: -"target:\"note_links\" — cap on returned nodes when depth > 1 (default 50)."New value: +"note_links: node cap for depth > 1; default 50."
      • changedInput schema / properties / name / description
        Previous value: -"Projects directory: exact-name candidates; continue incomplete coverage. target:\"skills\" view:\"one\": the skill's name, in place of skillId."New value: +"Projects directory: exact-name candidates; continue incomplete coverage. skills/one: name instead of skillId."
      • changedInput schema / properties / orgStatus / description
        Previous value: -"target:\"tasks\" organize=\"project\" — filter projects by status."New value: +"tasks organize:project: Project status filter."
      • changedInput schema / properties / organize / description
        Previous value: -"target:\"tasks\" — enumerate containers instead of tasks."New value: +"tasks: list containers instead of tasks."
      • changedInput schema / properties / owner / description
        Previous value: -"target:\"tasks\" — filter by owner."New value: +"tasks: owner filter."
      • changedInput schema / properties / projectId / description
        Previous value: -"target:projects brief/section/resources/resource/history — required stable Project ID. target:tasks — Project filter, or heading parent."New value: +"projects brief/section/resources/resource/history: required stable Project ID. tasks: Project filter or heading parent."
      • changedInput schema / properties / rhythmId / description
        Previous value: -"target:\"rhythms\" view:\"one\" (required) or view:\"runs\" (optional scope)."New value: +"rhythms: required for one; optional run scope for runs."
      • changedInput schema / properties / section / description
        Previous value: -"target:projects view:section — one Brief section."New value: +"projects/section: one Brief section."
      • changedInput schema / properties / seedIds / description
        Previous value: -"target:\"note_links\" — note id(s) to start the link-graph walk from (required)."New value: +"note_links: required starting note IDs."
      • changedInput schema / properties / seriesId / description
        Previous value: -"tasks: one recurring series’ complete occurrence history, newest first (includes completed)."New value: +"tasks: complete recurring-series history, newest first, including completed occurrences."
      • changedInput schema / properties / skillId / description
        Previous value: -"target:\"skills\" view:\"one\" (required unless name is given) or view:\"runs\" (optional scope)."New value: +"skills: required for one unless name is given; optional run scope for runs."
      • changedInput schema / properties / status / description
        Previous value: -"target:\"tasks\" — filter by task status."New value: +"tasks: status filter."
      • changedInput schema / properties / tags / description
        Previous value: -"Filter by tags. Applies to target \"search\" and \"notes\"."New value: +"search/notes: tag filter."
      • changedInput schema / properties / target / description
        Previous value: -"What to read. Walk the ladder in the tool description; first match wins."New value: +"What to read; first match in the tool description's ladder wins."
      • changedInput schema / properties / timeRange / description
        Previous value: -"Time window (ms epoch). Applies to target \"search\" and \"notes\"."New value: +"search/notes: time window (ms epoch)."
      • changedInput schema / properties / to / description
        Previous value: -"target:\"tracker\" entries / tracker_summary — end of window (ms epoch)."New value: +"tracker/entries, tracker_summary: window end (ms epoch)."
      • changedInput schema / properties / trackerId / description
        Previous value: -"target:\"tracker\" view:\"entries\" (required), or target:\"tracker_summary\" (required)."New value: +"Required for tracker/entries and tracker_summary."
      • changedInput schema / properties / tz / description
        Previous value: -"target:\"tasks\" — IANA timezone for Today/Upcoming boundaries."New value: +"tasks: IANA timezone for Today/Upcoming boundaries."
      • changedInput schema / properties / view / description
        Previous value: -"Projects: directory (default), brief, section, resources, resource, history, scopes (Space metadata), attention (dated candidates), interactions (actor only). Secondary selector: target:\"tracker\" list|entries; target:\"rhythms\" list|one|due|runs; target:\"skills\" list|one|due|runs|history|trash (list/trash omit instructions; one: full skill by skillId or name); target:\"tags\" list|related."New value: +"Projects: directory (default), brief, section, resources, resource, history, scopes (Space metadata), attention (dated candidates), interactions (actor only). tracker: list|entries; rhythms: list|one|due|runs; skills: list|one|due|runs|history|trash (list/trash omit instructions; one returns full skill by skillId or name); tags: list|related."
    • Changedpenny_session_start5 fields changed
      • changedInput schema / properties / installedSkillSource / description
        Previous value: -"Management: plugin manager for plugin copies; approved archive installation for standalone copies."New value: +"Manage plugin copies via plugin manager; standalone via approved archive installation."
      • changedInput schema / properties / installedSkillStatus / description
        Previous value: -"Report after reading the installed skill. Legacy omission returns not_reported."New value: +"Read installed skill, then report. Legacy omission returns not_reported."
      • changedInput schema / properties / installedSkillVersion / description
        Previous value: -"Exact metadata.version from the installed skill; omit if missing or unversioned."New value: +"Exact installed metadata.version; omit if missing or unversioned."
      • changedInput schema / properties / projectKey / description
        Previous value: -"Includes only the matching subconscious:<projectKey> block; other subconscious blocks are always excluded."New value: +"Include subconscious:<projectKey>; exclude all other subconscious blocks."
      • changedInput schema / properties / tz / description
        Previous value: -"IANA timezone for deriving today/overdue date boundaries (e.g. America/New_York). Defaults to UTC when omitted."New value: +"IANA timezone for today/overdue boundaries (e.g. America/New_York); default UTC."
    • Changedpenny_start_setup4 fields changed
      • changedInput schema / properties / client / description
        Previous value: -"Actual host: claude-desktop, claude-code, codex, chatgpt or other. Also tailors paste guidance."New value: +"Actual host: claude-desktop, claude-code, codex, chatgpt or other; tailors paste guidance."
      • changedInput schema / properties / counts / description
        Previous value: -"Cumulative answers/featuresCreated. imported is ignored for ledger imports; only committed receipts count."New value: +"Cumulative answers/featuresCreated. Ledger imports ignore imported; only committed receipts count."
      • changedInput schema / properties / prevAccepted / description
        Previous value: -"Whether the user took the previous tour stop's offer."New value: +"Did the user accept the previous tour stop's offer?"
      • changedInput schema / properties / skipForGood / description
        Previous value: -"The user said to skip setup for good."New value: +"User requested permanent setup opt-out."
    • Changedpenny_write48 fields changed
      • changedInput schema / properties / actor / description
        Previous value: -"entityType:\"task\"/\"area\"/\"project\"/\"heading\" — who took the action (me|agent), written to the activity ledger."New value: +"task/area/project/heading: actor (me|agent) recorded in activity ledger."
      • changedInput schema / properties / agentNote / description
        Previous value: -"entityType:\"tracker_entry\" (single-entry form only) — short caption on this one data point (not searchable)."New value: +"tracker_entry, single only: short non-searchable caption."
      • changedInput schema / properties / areaId / description
        Previous value: -"entityType:\"project\" (required) — the area the project belongs to."New value: +"project: required parent area."
      • changedInput schema / properties / blockName / description
        Previous value: -"entityType:\"profile\" (required) — the profile block name to upsert."New value: +"profile: required block name to upsert."
      • changedInput schema / properties / child / description
        Previous value: -"entityType:\"tag_relation\" (required) — the child tag."New value: +"tag_relation: required child tag."
      • changedInput schema / properties / content / description
        Previous value: -"entityType:\"profile\" (required) — the block content."New value: +"profile: required block content."
      • changedInput schema / properties / deadline / description
        Previous value: -"entityType:\"task\"/\"project\" — hard due date (ms epoch)."New value: +"task/project: hard due date (ms epoch)."
      • changedInput schema / properties / deliver / description
        Previous value: -"entityType:\"skill\" — REQUIRED once `trigger` is set (and on the legacy entityType:\"rhythm\"); omit on an on-demand skill. Where a scheduled run's output lands: { kind:'note', tags?:string[] } | { kind:'profile_block', blockName:string } | { kind:'notify' }."New value: +"entityType:\"skill\": required with trigger; rhythm: required. Omit for on-demand. Scheduled output: {kind:'note',tags?:string[]}|{kind:'profile_block',blockName:string}|{kind:'notify'}."
      • changedInput schema / properties / dependsOn / description
        Previous value: -"entityType:\"task\" — full replacement set of taskIds that must complete first."New value: +"task: full prerequisite taskId set; replaces all."
      • changedInput schema / properties / description / description
        Previous value: -"entityType:\"tracker\" (required) — natural-language meaning. entityType:\"skill\" (required — every skill, on-demand or scheduled) or legacy \"rhythm\" — one-line description of what it is for."New value: +"tracker: required meaning. entityType:\"skill\"/rhythm: required one-line purpose, including on-demand skills."
      • changedInput schema / properties / entityType / description
        Previous value: -"What to create. Walk the ladder in the tool description; first match wins."New value: +"What to create; first match in the tool description's ladder wins."
      • changedInput schema / properties / entries / description
        Previous value: -"tracker_entry: batch up to 100 entries for one trackerId; each {payload,loggedAt?,agentNote?,noteIds?,source?,metadata?}. Mutually exclusive with top-level payload. Receipts report each saved/failed item; do not claim all saved from a partial result."New value: +"tracker_entry: up to 100 for one trackerId; each {payload,loggedAt?,agentNote?,noteIds?,source?,metadata?,externalId?}. Mutually exclusive with top-level payload. Receipts list saved/failed items and duplicates for stored externalIds; do not claim all saved from a partial result."
      • changedInput schema / properties / expectedRevision / description
        Previous value: -"Project edit revision from Brief; reconcile conflicts."New value: +"Project revision from Brief; reconcile conflicts."
      • changedInput schema / properties / expectedUpdatedAt / description
        Previous value: -"Source version from the read."New value: +"Source version from read."
      • addedInput schema / properties / externalId
        Added value: +{
        +  "description": "tracker_entry, also entries items: source record ID, max 200 chars. Use for imports/sync: repeats on the same tracker return the existing entry as duplicate. Opaque, unencrypted: never include content.",
        +  "type": "string"
        +}
      • changedInput schema / properties / goal / description
        Previous value: -"entityType:\"rhythm\" (required) — natural-language instruction: what the run should do. On entityType:\"skill\" this is `instructions`."New value: +"rhythm: required run instructions; skill uses instructions instead."
      • changedInput schema / properties / headingId / description
        Previous value: -"entityType:\"task\" — heading to file the task under."New value: +"task: parent heading."
      • changedInput schema / properties / instructions / description
        Previous value: -"entityType:\"skill\" (required) — the saved know-how: what to do when the skill is invoked, or when a connected agent picks it up after it comes due. Generalizes the rhythm \"goal\"."New value: +"skill: required know-how for invocation or when a connected agent picks up a due skill. Replaces rhythm goal."
      • changedInput schema / properties / kind / description
        Previous value: -"entityType:\"tracker\" (required) — habit | metric | goal | log | status | custom."New value: +"tracker: required; habit|metric|goal|log|status|custom."
      • changedInput schema / properties / linkNotes / description
        Previous value: -"entityType:\"task\" — note ids to link to this task."New value: +"task: note IDs to link."
      • changedInput schema / properties / name / description
        Previous value: -"Required for tracker/area/project and entityType:\"skill\" (also rhythm); for skill_invoke/skill_run, an alternative to skillId. Existing skill names prepare a change preview; new names create. Active tracker duplicates are rejected; archived names reactivate."New value: +"Required: tracker/area/project/rhythm and entityType:\"skill\". skill_invoke/skill_run: alternative to skillId. Existing skill names preview changes; new names create. Active tracker duplicates are rejected; archived names reactivate."
      • changedInput schema / properties / noteIds / description
        Previous value: -"entityType:\"tracker_entry\" — archival note ids to attach; or \"tracker_note_link\" (required) — the notes to link."New value: +"tracker_entry: archival note IDs to attach. tracker_note_link: required note IDs to link."
      • changedInput schema / properties / order / description
        Previous value: -"entityType:\"task\"/\"area\"/\"project\"/\"heading\" — sort order."New value: +"task/area/project/heading: sort order."
      • changedInput schema / properties / owner / description
        Previous value: -"entityType:\"task\" — assignee."New value: +"task: assignee."
      • changedInput schema / properties / parent / description
        Previous value: -"entityType:\"tag_relation\" (required) — the parent tag in the child_of edge."New value: +"tag_relation: required parent tag of child_of edge."
      • changedInput schema / properties / patch / description
        Previous value: -"Project sparse changes; omitted fields stay. Max 25 step/resource changes."New value: +"Project: sparse changes; omitted fields stay. Max 25 step/resource changes."
      • changedInput schema / properties / patch / properties / steps / description
        Previous value: -"accept converts a saved suggestion into a To-do."New value: +"accept turns a saved suggestion into a To-do."
      • changedInput schema / properties / payload / description
        Previous value: -"entityType:\"tracker_entry\" (required unless `entries` is used) — the structured data point; shape is tracker-defined."New value: +"tracker_entry: tracker-defined data point; required unless entries is used."
      • changedInput schema / properties / posture / description
        Previous value: -"entityType:\"skill\" with a `trigger` set (or legacy \"rhythm\") — read | propose | act (defaults 'read')."New value: +"entityType:\"skill\" with trigger, or rhythm: read|propose|act; default read."
      • changedInput schema / properties / projectId / description
        Previous value: -"entityType:\"task\" — parent project; or \"heading\" — the project it belongs to (required)."New value: +"task: parent Project. heading: required parent Project."
      • changedInput schema / properties / reasoning / description
        Previous value: -"entityType:\"tag_relation\" — short justification (typically a user quote) for the edge."New value: +"tag_relation: short edge justification, typically a user quote."
      • changedInput schema / properties / recordedAt / description
        Previous value: -"entityType:\"tracker_entry\" (single-entry form only) — observation time (ms epoch; defaults to now)."New value: +"tracker_entry, single only: observation time (ms epoch); default now."
      • changedInput schema / properties / recurrence / description
        Previous value: -"entityType:\"task\" — makes the task repeat. The returned `taskId` is this task's first occurrence; completing it later returns `nextTaskId` for the next one (see penny_edit's `status` field) — don't cache this id past its first completion."New value: +"task: repeat. Returned taskId is the first occurrence; completion returns nextTaskId (see penny_edit status). Never reuse a completed occurrence's ID."
      • changedInput schema / properties / recurrence / properties / at / description
        Previous value: -"Time expression: \"HH:MM\" for daily, \"<Wd> HH:MM\" for weekly, \"DD HH:MM\" for monthly."New value: +"daily: HH:MM; weekly: <Wd> HH:MM; monthly: DD HH:MM."
      • changedInput schema / properties / retrievalPlan / description
        Previous value: -"entityType:\"skill\" (or legacy \"rhythm\") — OPTIONAL deterministic steps [{ tool, args }] for a bounded tier."New value: +"entityType:\"skill\"/rhythm: optional deterministic steps [{tool,args}] for a bounded tier."
      • changedInput schema / properties / rhythmId / description
        Previous value: -"entityType:\"rhythm_run\" — the rhythm to begin a run of (or pass `name`)."New value: +"rhythm_run: rhythm to begin; or pass name."
      • changedInput schema / properties / skillId / description
        Previous value: -"entityType:\"skill_invoke\" (required, or pass `name`) — the skill to run now. entityType:\"skill_run\" — the skill to begin a run of (or pass `name`)."New value: +"skill_invoke/skill_run: skill to run now/begin; required unless name is given."
      • changedInput schema / properties / source / description
        Previous value: -"entityType:\"note\"/\"tracker_entry\" — provenance label (defaults 'conversation' / 'agent-mcp')."New value: +"note/tracker_entry: provenance; defaults conversation/agent-mcp respectively."
      • changedInput schema / properties / status / description
        Previous value: -"entityType:\"task\" — initial status."New value: +"task: initial status."
      • changedInput schema / properties / tags / description
        Previous value: -"entityType:\"task\" — tags to attach."New value: +"task: tags to attach."
      • changedInput schema / properties / targetSpec / description
        Previous value: -"entityType:\"tracker\" — JSON target spec, interpreted at retrieval (e.g. { kind: 'daily_minimum', value: 10000 })."New value: +"tracker: JSON target spec, interpreted at retrieval (e.g. {kind:'daily_minimum',value:10000})."
      • changedInput schema / properties / title / description
        Previous value: -"entityType:\"task\" (required) or \"heading\" (required) — the title/label."New value: +"task/heading: required title/label."
      • changedInput schema / properties / trackerEntryId / description
        Previous value: -"entityType:\"tracker_note_link\" (required) — the logged tracker entry to attach notes to."New value: +"tracker_note_link: required entry to attach notes to."
      • changedInput schema / properties / trackerId / description
        Previous value: -"entityType:\"tracker_entry\" (required) — the tracker to log against."New value: +"tracker_entry: required tracker to log against."
      • changedInput schema / properties / trigger / description
        Previous value: -"entityType:\"skill\": optional schedule (required for rhythm), requires deliver. Penny does not run it: due signals reach the connected agent. Schedule: {kind:\"schedule\",cadence:\"daily\"|\"weekly\"|\"monthly\",at?:\"Fri 16:00\",timezone?:\"America/Denver\"}. ALWAYS set timezone (IANA); default UTC shifts local times. Event: {kind:\"event\",on:\"note.created\",where?:{tags?:string[]}}."New value: +"entityType:\"skill\": optional; rhythm: required. Requires deliver. Penny does not run it; due signals reach the connected agent. Schedule: {kind:\"schedule\",cadence:\"daily\"|\"weekly\"|\"monthly\",at?:\"Fri 16:00\",timezone?:\"America/Denver\"}. ALWAYS set IANA timezone; default UTC shifts local times. Event: {kind:\"event\",on:\"note.created\",where?:{tags?:string[]}}."
      • changedInput schema / properties / unit / description
        Previous value: -"entityType:\"tracker\" — unit of measure."New value: +"tracker: unit of measure."
      • changedInput schema / properties / whenAt / description
        Previous value: -"entityType:\"task\"/\"project\" — schedule date (ms epoch)."New value: +"task/project: schedule date (ms epoch)."
      • changedInput schema / properties / whenBucket / description
        Previous value: -"entityType:\"task\"/\"project\" — undated bucket; mutually exclusive with whenAt."New value: +"task/project: undated bucket; mutually exclusive with whenAt."
  8. 1 tool update
    • Changedpenny_read3 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Projects directory: exact-name candidates; continue incomplete coverage."New value: +"Projects directory: exact-name candidates; continue incomplete coverage. target:\"skills\" view:\"one\": the skill's name, in place of skillId."
      • changedInput schema / properties / skillId / description
        Previous value: -"target:\"skills\" view:\"one\" (required) or view:\"runs\" (optional scope)."New value: +"target:\"skills\" view:\"one\" (required unless name is given) or view:\"runs\" (optional scope)."
      • changedInput schema / properties / view / description
        Previous value: -"Projects: directory (default), brief, section, resources, resource, history, scopes (Space metadata), attention (dated candidates), interactions (actor only). Secondary selector: target:\"tracker\" list|entries; target:\"rhythms\" list|one|due|runs; target:\"skills\" list|one|due|runs|history|trash (to run one, use penny_write \"skill_invoke\"); target:\"tags\" list|related."New value: +"Projects: directory (default), brief, section, resources, resource, history, scopes (Space metadata), attention (dated candidates), interactions (actor only). Secondary selector: target:\"tracker\" list|entries; target:\"rhythms\" list|one|due|runs; target:\"skills\" list|one|due|runs|history|trash (list/trash omit instructions; one: full skill by skillId or name); target:\"tags\" list|related."
  9. 2 tool updates
    • Changedpenny_edit2 fields changed
      • changedInput schema / properties / enabled / description
        Previous value: -"entityType:\"skill\": false pauses due signals, true resumes; requires skillId. MyPenny does not run skills."New value: +"entityType:\"skill\": false pauses due signals, true resumes; requires skillId. Penny does not run skills."
      • changedInput schema / properties / trigger / description
        Previous value: -"entityType:\"skill\": optional (required for rhythm). Omit to return to on-demand. MyPenny does not run it; the connected agent receives due signals. See penny_write for shape; ALWAYS set IANA timezone, default UTC."New value: +"entityType:\"skill\": optional (required for rhythm). Omit to return to on-demand. Penny does not run it; the connected agent receives due signals. See penny_write for shape; ALWAYS set IANA timezone, default UTC."
    • Changedpenny_write1 field changed
      • changedInput schema / properties / trigger / description
        Previous value: -"entityType:\"skill\": optional schedule (required for rhythm), requires deliver. MyPenny does not run it: due signals reach the connected agent. Schedule: {kind:\"schedule\",cadence:\"daily\"|\"weekly\"|\"monthly\",at?:\"Fri 16:00\",timezone?:\"America/Denver\"}. ALWAYS set timezone (IANA); default UTC shifts local times. Event: {kind:\"event\",on:\"note.created\",where?:{tags?:string[]}}."New value: +"entityType:\"skill\": optional schedule (required for rhythm), requires deliver. Penny does not run it: due signals reach the connected agent. Schedule: {kind:\"schedule\",cadence:\"daily\"|\"weekly\"|\"monthly\",at?:\"Fri 16:00\",timezone?:\"America/Denver\"}. ALWAYS set timezone (IANA); default UTC shifts local times. Event: {kind:\"event\",on:\"note.created\",where?:{tags?:string[]}}."
  10. 3 tool updates
    • Changedpenny_edit1 field changed
      • changedInput schema / properties / recurrence / description
        Previous value: -"entityType:\"task\" — makes the task repeat, or (on an existing repeating task) changes its schedule. Setting `clearFields: [\"recurrence\"]` ENDS the series (task becomes a one-off; completed occurrences stay as history) but must target `currentOccurrenceId`, not a stale/completed id."New value: +"task: set/change recurrence. clearFields:[\"recurrence\"] ends the series, making the task one-off and preserving completed history. Target currentOccurrenceId, not a stale/completed ID."
    • Changedpenny_session_start2 fields changed
      • changedInput schema / properties / installedSkillSource / description
        Previous value: -"How the skill is managed; plugin copies update through the plugin manager, standalone copies through approved archive installation."New value: +"Management: plugin manager for plugin copies; approved archive installation for standalone copies."
      • changedInput schema / properties / installedSkillStatus / description
        Previous value: -"Report after reading the installed Penny skill. Omission is retained only for legacy clients and returns not_reported."New value: +"Report after reading the installed skill. Legacy omission returns not_reported."
    • Changedpenny_start_setup10 fields changed
      • changedInput schema / properties / client / description
        Previous value: -"Optional client hint: 'claude-desktop' | 'chatgpt' | 'claude-web' | other. Tailors the snippet's where-to-paste guidance."New value: +"Actual host: claude-desktop, claude-code, codex, chatgpt or other. Also tailors paste guidance."
      • addedInput schema / properties / counts
        Added value: +{
        +  "description": "Cumulative answers/featuresCreated. imported is ignored for ledger imports; only committed receipts count.",
        +  "properties": {
        +    "answers": {
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "featuresCreated": {
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "imported": {
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / draftId
        Added value: +{
        +  "description": "Returned collection ID; stage only.",
        +  "type": "string"
        +}
      • addedInput schema / properties / expectedRevision
        Added value: +{
        +  "description": "Returned revision; stage only.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / importAction
        Added value: +{
        +  "description": "Stage needs importDraft, draftId, expectedRevision. Status has no content. No model approval.",
        +  "enum": [
        +    "stage",
        +    "status"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / importDraft
        Added value: +{
        +  "description": "Strict JSON {notes,profiles}; returned schema. 10 notes, 4 replacements, 64 KiB UTF-8. No approval/source/selection.",
        +  "type": "string"
        +}
      • addedInput schema / properties / phase
        Added value: +{
        +  "description": "Phase to run; omit to start.",
        +  "enum": [
        +    "start",
        +    "import",
        +    "gaps",
        +    "tour",
        +    "finish"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / prevAccepted
        Added value: +{
        +  "description": "Whether the user took the previous tour stop's offer.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / skipForGood
        Added value: +{
        +  "description": "The user said to skip setup for good.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / stop
        Added value: +{
        +  "description": "Tour stop, with phase tour.",
        +  "maximum": 4,
        +  "minimum": 0,
        +  "type": "integer"
        +}
  11. 1 tool update
    • Changedpenny_read1 field changed
      • addedInput schema / properties / ifRevision
        Added value: +{
        +  "description": "profile: the revision from your last read; returns {unchanged:true} if nothing changed.",
        +  "type": "string"
        +}
  12. 7 tool updates
    • First observedpenny_delete
    • First observedpenny_edit
    • First observedpenny_get_skill
    • First observedpenny_read
    • First observedpenny_session_start
    • First observedpenny_start_setup
    • First observedpenny_write

Publisher details

Operator
Helper Labs
Vendor relationship
Not applicable
Trust center
Not available
Restrictions
Free trial with paid plan. OAuth MCP connector.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    B
    maintenance
    Personal RAG database and semantic search built from inside your AI chat. Store knowledge, voice, and skills; Claude and ChatGPT create work that sounds like you.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables persistent, searchable memory for AI assistants across platforms like Claude, ChatGPT, and Gemini, using semantic search and automatic deduplication.
    17 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A persistent memory layer for AI tools that decouples personal data from AI's unstable memory, enabling you to mention information once and have it remembered forever across all conversations.
    3
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources