Skip to main content
Glama

MyPenny

Server Details

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

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.6/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: delete, edit, read, write, session start, setup, and skill retrieval. The boundaries between penny_write and penny_edit are explicit (create vs. update), and penny_read vs. penny_session_start are separated by context (on-demand vs. orientation). No two tools could be confused.

Naming Consistency4/5

All tools share the 'penny_' prefix and mostly follow a verb_noun pattern (delete, edit, get_skill, read, write, start_setup). The exception is 'session_start' which reverses the order (noun_verb) but remains readable and consistent with the prefix. Minor deviation, otherwise uniform.

Tool Count5/5

Seven tools is well-scoped for a personal memory assistant: one create, one read, one update, one delete, plus session setup and skill retrieval. Each tool earns its place, covering the core lifecycle without redundancy or bloat.

Completeness5/5

The set provides full CRUD coverage for all entity types (notes, tasks, trackers, skills, projects, profile) plus session management and setup. Read/search, write/create, edit/update, and delete/trash are all represented, with no obvious dead ends or missing operations for the stated purpose.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoentityType:"note"/"tracker_entry" — ids to trash (max 100); "rhythm"/"skill" — exactly one id; "profile_block" — block names to trash.
tagANoentityType:"tag_relation" (required) — one endpoint of the edge to remove.
tagBNoentityType:"tag_relation" (required) — the other endpoint.
scopeNoProfile block scope; Project private overrides defaults, workspace requires workspaceId.
noteIdsNoentityType:"tracker_note_link" (required) — the notes to unlink.
projectIdNo
entityTypeYesWhat to trash.
operationIdNo
trackerEntryIdNoentityType:"tracker_note_link" (required) — the entry to detach notes from.
expectedRevisionNo

TDQS

A4.7/5.0
Behavior5/5

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

The description goes well beyond the annotations by disclosing recoverability, in-progress repeat semantics, partial_recovery conflict reporting, and the special handling for tasks and tracker definitions. These details align with destructiveHint and idempotentHint rather than contradicting them.

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 description is front-loaded with the core purpose, then uses dense semicolon-separated rules with no filler. Each clause encodes a distinct behavioral or parameter rule, though its telegraphic density makes it slightly harder to parse than a more narrative form would 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 an 8-entity-type, 10-parameter destructive tool with no output schema, the description covers all entityType behaviors, idempotency rules, and sibling handoffs. It could add return-shape or conflict-response detail, but the operation and recovery guidance make it sufficiently complete for correct 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?

With 70% schema coverage, the description adds real combinatorial meaning that the schema alone does not convey: it ties projectId/expectedRevision/operationId to project behavior, states per-entity id limits, and points tag/link removal to the correct parameters. It does not fully explain every parameter interaction, but it substantially compensates for the coverage gap.

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 'Move to Trash,' a specific verb and resource that immediately identifies the tool's destructive function. It also distinguishes itself from siblings by naming penny_edit for restore/cancel and stating that tracker definitions are archived, not deleted.

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 routes tasks to penny_edit and states that tracker definitions are archived, giving clear when-not-to-use guidance. It also identifies penny_edit op:restore as the recovery alternative and explains the idempotent retry behavior for in-progress operations, leaving little to inference.

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

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 something that already exists in the user's memory, chosen by entityType — same taxonomy as penny_write (see its ladder). Notes take updates[] (patch or replace, up to 100); tasks require taskId (set status: "canceled" to remove a task — tasks are never trashed); profile blocks are upserts (blockName + content; memory_policy and persona are the two standing-instruction blocks — see penny_write's ladder). 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; op:cancel discards and op:undo recovers the previous version. Read skills view:history for version IDs; op:restore_revision with skillId, historyId, expectedUpdatedAt previews a restore. op:restore with skillId recovers a deleted skill, disabled. No invocation waiting period applies. Trackers take trackerId and patch only the fields you pass (name/description/unit/kind/targetSpec/archived — archiving is the retire path, there is no tracker delete; private trackers only, not yet workspace-shared ones); rhythms are re-defined by full manifest; entityType: "rhythm_run" completes a run (runId + status). Projects take projectId + expectedRevision + operationId + a sparse patch (reread and reconcile on conflict); op: "restore_revision" restores selected fields/resourceIds from a historyId as a new revision. Tracker entries take trackerId + entryId + expectedUpdatedAt + the full payload. op: "restore" un-trashes notes or tracker entries by ids, or a Project by projectId.

ParametersJSON Schema
NameRequiredDescriptionDefault
opNoop:"restore" un-trashes notes or tracker entries by `ids`.
idsNoop:"restore" — ids to un-trash (max 100).
goalNoentityType:"rhythm" (required) — what the run should do. On entityType:"skill" this is `instructions`.
kindNoentityType:"tracker" — habit | metric | goal | log | status | custom.
nameNoArea/project/tracker name; entityType:"skill" names prepare a preview of the replacement (rhythm names upsert).
unitNoentityType:"tracker" — unit of measure.
actorNoentityType:"task"/"area"/"project"/"heading" — who took the action (me|agent), written to the activity ledger.
notesNoentityType:"task"/"area"/"project" — markdown body.
orderNoentityType:"task"/"area"/"project"/"heading" — sort order.
orgIdNoentityType:"area"/"project"/"heading" (required) — the container to update.
ownerNoentityType:"task" — assignee.
patchNoProject patch: full schema on penny_write.
runIdNoentityType:"skill_run" (required) — the run to complete; same field on the legacy "rhythm_run".
scopeNoProfile: global|workspace. Projects: private; workspace requires workspaceId.
titleNoentityType:"task"/"heading" — the title/label.
areaIdNoentityType:"project" — the area the project belongs to.
fieldsNoRestore selection: field names or step:<stepId>; fields/resourceIds required.
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.
taskIdNoentityType:"task" (required) — the task to update.
whenAtNoentityType:"task"/"project" — schedule date (ms epoch).
contentNoentityType:"profile" (required) — the new block content.
deliverNoentityType:"skill": required with trigger (also rhythm); omit for on-demand. See penny_write for shape.
enabledNoentityType:"skill": false pauses due signals, true resumes; requires skillId. MyPenny does not run skills.
entryIdNo
payloadNo
postureNoentityType:"skill" with a `trigger` set (or legacy "rhythm") — read | propose | act.
skillIdNoentityType:"skill" pause/resume — the skill id (required with enabled).
triggerNoentityType:"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.
updatesNoentityType:"note" — patch or supersede existing notes (up to 100).
archivedNoArea/project/tracker: archive; false reactivates. Tracker definitions retire only this way.
deadlineNoentityType:"task"/"project" — hard due date (ms epoch).
snapshotNoSkill restore_revision: which side of the history entry to restore (default before). Select after to recover a change that was undone.
agentNoteNo
blockNameNoentityType:"profile" (required) — the profile block to upsert.
dependsOnNoentityType:"task" — full replacement set of taskIds that must complete first.
historyIdNorestore_revision: Project history item or skill history item. Skill restoration prepares a preview; requires skillId and expectedUpdatedAt.
linkNotesNoentityType:"task" — note ids to link to this task.
projectIdNoentityType:"heading" (required) — the project the heading belongs to.
trackerIdNoentityType:"tracker" (required) — the tracker to update. Only the fields you pass are patched — omit any you don't want to change.
entityTypeYesItem type.
proposalIdNoSkill change proposal returned by an edit. op:apply commits after user review; cancel discards; undo restores the previous version if no later edit exists.
provenanceNoentityType:"rhythm_run" — accountability summary of what the run did (ids/labels, never full content).
recordedAtNo
recurrenceNoentityType:"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.
targetSpecNotracker: replaces the whole target spec; shape as penny_write.
whenBucketNoentityType:"task"/"project" — undated bucket; mutually exclusive with whenAt.
clearFieldsNoentityType:"task" — names of optional fields to UNSET on the task.
descriptionNoentityType:"skill": REQUIRED use-when description; also rhythm. tracker: meaning; log trackers must document payload shape.
operationIdNoProject receipt key; identical retries only.
resourceIdsNoRestore selected links.
instructionsNoentityType:"skill" (required) — the saved know-how (generalizes the rhythm "goal").
retrievalPlanNoentityType:"skill" (or legacy "rhythm") — OPTIONAL deterministic steps for a bounded tier.
expectedRevisionNoProject edit revision from Brief; reconcile conflicts.
expectedUpdatedAtNoSource version from the read.

TDQS

A4.7/5.0
Behavior5/5

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

Even with annotations already marking this as destructive and non-read-only, the description adds extensive behavioral detail: tasks are never trashed, tracker definitions are retired via archiving, skill edits produce a preview requiring approval before op:apply, op:undo restores the previous version, and restore operations un-trash or recover deleted skills. This goes well 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.

Conciseness4/5

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

The description is dense and organized by entity type, and every sentence carries operational meaning, but it is a single long paragraph with no bullet structure. The front-loaded general rule helps, though readability would improve with formatting.

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 54-parameter, multi-entity edit tool with no output schema, the description is remarkably complete: it covers notes, tasks, profiles, skills, trackers, rhythms, projects, tracker entries, restore flows, approval gates, and conflict requirements. The only outsourced details are shapes explicitly deferred to penny_write's ladder.

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

Parameters5/5

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

Schema coverage is 93%, but the description still adds meaning by explaining entity-specific semantics: notes use updates[] up to 100, tasks require taskId and use canceled to remove, profile blocks are upserts with memory_policy and persona as standing blocks, trackers patch only passed fields, and projects require expectedRevision plus operationId. It also points to penny_write for shared shapes.

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 instruction: when a user corrects something on file, edit the existing item rather than writing a duplicate, and states it modifies existing memory selected by entityType. This clearly differentiates from penny_write, which the text references for the taxonomy and creation-side shapes.

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?

It gives an explicit trigger condition ('When the user corrects something... needs to change') and tells the agent to edit rather than write a duplicate, which implies penny_write is for new items. It does not explicitly enumerate when-not-to-use cases or name alternative tools like penny_delete, so it falls just short of a 5.

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

penny_get_skillA
Read-onlyIdempotent
Inspect

Read the current Penny operating skill when session start reports a stale or missing installed copy. Default returns only SKILL.md; use file for a reference path from manifest when its cue applies. Use view:install after user approval for an exact installation archive and per-file hashes. Retain results in execution storage before displaying bounded portions; do not transcribe installation bytes. This is product guidance, not user-saved skills. Read-only; workspace-only connections may use it.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNoExact manifest path, default SKILL.md; read view only.
viewNoDefault read. Install returns an archive, not readable guidance.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context: retain results in execution storage before displaying bounded portions, and do not transcribe installation bytes. It also notes workspace-only connection usability. No contradiction with annotations; the added storage/display guidance exceeds what annotations provide.

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 description is compact, with the core purpose front-loaded and every sentence contributing operational detail. It is slightly dense but avoids filler; no wasted words. The length is appropriate for the complexity.

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?

With two optional parameters, no output schema, and annotations covering safety, the description covers the trigger, parameter usage, output handling, and scope. It lacks explicit return-format details, but the absence of an output schema makes that less critical. Overall, an agent has enough to call it correctly in the intended context.

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% and the schema already documents both parameters. The description enriches them: file's default and manifest path usage, and view's install mode returning an archive with hashes. This goes beyond the schema's basic descriptions, adding concrete operational meaning.

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 explicitly states it reads the Penny operating skill, names the trigger (stale/missing copy reported by session start), and distinguishes it from siblings by clarifying it is product guidance, not user-saved skills. This differentiates it from penny_read and other siblings without ambiguity.

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?

It provides a clear trigger condition (when session start reports stale/missing) and gives parameter-specific guidance (use file for manifest paths, view:install after approval). It implicitly excludes use for user-saved skills, but does not explicitly name alternative tools like penny_read, though the distinction is stated. This is strong but not exhaustive.

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. Read from the user's memory. Choosing target — walk this ladder, first match wins:

  1. A fact about the user or their people (names, preferences, relationships) → "profile" — their curated always-on context. Do NOT search notes for this.

  2. Their to-dos or what's due → "tasks". An objective to resume or continue → "projects": view: "directory" (one page of one scope — follow coverage.nextCursor; query or exact name to narrow), then view: "brief" by projectId; view: "scopes" lists Space metadata, after which pass an 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. Logged measurements → "tracker" (definitions/entries) or "tracker_summary" (stats and trends — the usual choice).

  4. Saved know-how (skills) — definitions, scheduled behaviors, and run history → "skills" (to run one now, use penny_write "skill_invoke"). ("rhythms" remains the scheduled-only synonym.) 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. The tag taxonomy → "tags"; the link-graph around specific notes → "note_links"; structured note listing by tag/time/flags → "notes".

  6. Everything else → "search" — semantic search over 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. Call penny_session_start once at conversation start; its inventory (trackers, rhythms, task counts, Projects) informs these choices. Project reads also work without it.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNotarget:"tracker" entries / tracker_summary — end of window (ms epoch).
tzNotarget:"tasks" — IANA timezone for Today/Upcoming boundaries.
fromNotarget:"tracker" entries / tracker_summary — start of window (ms epoch).
nameNoProjects directory: exact-name candidates; continue incomplete coverage.
tagsNoFilter by tags. Applies to target "search" and "notes".
viewNoProjects: 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.
depthNotarget:"note_links" — hops to expand (1 = direct links; 2-6 = bounded BFS).
flagsNonotes: locked/pinned filter.
limitNoMax results. Applies to search, notes, tracker entries, tasks, and rhythm runs.
ownerNotarget:"tasks" — filter by owner.
queryNosearch: required semantic query. projects directory: name/purpose filter; check coverage.
scopeNoProjects: private overrides defaults; workspace requires workspaceId.
areaIdNotarget:"tasks" — filter by area, or organize="project" filter.
bucketNotarget:"tasks" — filter by schedule bucket.
cursorNoProject cursor; retain view/scope.
statusNotarget:"tasks" — filter by task status.
targetYesWhat to read. Walk the ladder in the tool description; first match wins.
taskIdNotasks: full detail. A repeating task returns seriesId/currentOccurrenceId; act on the current occurrence, not a completed ID.
blockedNotarget:"tasks" — restrict to tasks with unmet dependsOn.
sectionNotarget:projects view:section — one Brief section.
seedIdsNotarget:"note_links" — note id(s) to start the link-graph walk from (required).
skillIdNotarget:"skills" view:"one" (required) or view:"runs" (optional scope).
dateAxisNotarget:"notes" — which date timeRange filters ('created' = when written, 'valid' = when the fact holds).
dueRangeNotarget:"tasks" — due-date window (ms epoch).
eventKeyNoProjects interactions: actor event key; omit to page.
maxDepthNotags/related: maximum traversal depth.
maxNodesNotarget:"note_links" — cap on returned nodes when depth > 1 (default 50).
organizeNotarget:"tasks" — enumerate containers instead of tasks.
rhythmIdNotarget:"rhythms" view:"one" (required) or view:"runs" (optional scope).
seriesIdNotasks: one recurring series’ complete occurrence history, newest first (includes completed).
edgeTypesNotarget:"note_links" — only follow/return edges of these relationship types.
minWeightNotags/related: minimum edge weight (default 0.4).
orgStatusNotarget:"tasks" organize="project" — filter projects by status.
projectIdNotarget:projects brief/section/resources/resource/history — required stable Project ID. target:tasks — Project filter, or heading parent.
timeRangeNoTime window (ms epoch). Applies to target "search" and "notes".
trackerIdNotarget:"tracker" view:"entries" (required), or target:"tracker_summary" (required).
blockNamesNoprofile: exact block names.
confidenceNonotes: confidence range.
projectKeyNoprofile: include subconscious:<projectKey>.
resourceIdNoProjects resource: read the authorized current source.
enabledOnlyNotarget:"rhythms" view:"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.
includeCompletedNotarget:"tasks" — include done/canceled tasks (default false).
includeRelationsNotags/list: include parents/children/synonyms.

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark the tool read-only, idempotent, and non-destructive, so the bar is lower, but the description adds substantial behavioral context: search results from shared spaces must be treated as statements by a member, skills are never auto-run and must be offered when due, and project reads work without session_start. No contradictions with annotations exist.

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

Conciseness5/5

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

The description is long but justified by an 11-target router with 46 parameters. It is front-loaded with the core mandate, organized as a numbered ladder, and uses compact code-formatted syntax. Every section earns its place; there is no filler.

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, the description covers target selection, navigation workflows, pagination hints (coverage.nextCursor), cross-tool coordination, and the shared-space caveat. Nothing an agent needs to choose the right read target and associated parameters is missing.

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

Parameters5/5

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

Although schema coverage is 98%, the description adds meaning the schema cannot: the target-ladder decision algorithm, view sequencing for projects (directory then brief then scopes), which target is 'the usual choice,' and how params like query, name, projectId, and workspaceId interact across targets. This semantics is essential for correct invocation.

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 clearly states the tool's job: read from the user's memory before answering anything informed by history or preferences. It distinguishes itself from siblings by enumerating the eleven read targets and referencing penny_write for execution actions, so an agent can tell exactly what this tool is for.

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?

The description gives an explicit when-to-use directive ('Before answering anything the user's history, preferences, or prior work would inform'), a first-match-wins ladder with targeted guidance, and explicit exclusions like 'Do NOT search notes for this' and 'Search is the fallback, not the default.' It also routes to sibling tools (penny_write for skill_invoke, penny_session_start for inventory).

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

Before calling, read the installed Penny skill and report installedSkillStatus (versioned, unversioned, or missing), installedSkillVersion and installedSkillSha256 from its metadata when versioned, and installedSkillSource. If this host cannot install skills, report missing/unsupported. Do not guess metadata from the plugin or catalog version. Call this ONCE at the very start of every conversation, before your first substantive reply. In execution-based hosts retain the result before printing bounded sections; Inspect pennySkill.status and instructions BEFORE selecting profile blocks. Inspect one payload, not both text and structured copies. Reuse returned profile blocks. Follow pennySkill.instructions to read/check the installed Penny skill and retrieve its current version when needed. Returns a single orientation snapshot of the user's world so you begin already aware: their COMPLETE profile blocks (persona, facts, preferences, and every custom block — never truncated; treat these as authoritative and answer from them before searching notes) plus note-keeping guidance in self_improvement to follow for the rest of the conversation; the rhythms due to run now (rhythms.due); and an inventory of their trackers. meta.onboarded false → offer setup via penny_start_setup; meta.saveDrought true → follow the guidance's drought-repair step. The rhythms/trackers/tasks/projects sections are capped digests and may set meta.truncated.* — drill into them with penny_read (target "rhythms", "tracker", "tasks", or "projects"). Pass projectKey to also include that one project's subconscious block. Pass tz (IANA, e.g. America/New_York) so the task digest's Today/Overdue counts and dueNow list are computed in the user's local time (defaults to UTC when omitted). Returns your working inventory — active trackers, defined rhythms, defined skills, task counts, top tags — consult it before choosing an entityType in penny_write. skills.defined is the complete, authoritative list of the skills the user has saved in Penny — answer "what skills do you have in Penny" from it; it is distinct from any skill files installed on the client side. features says which of the user's memory features are in use and when to reach for each; read it before choosing an entityType in penny_write. projects is a bounded PRIVATE Project directory with coverage and dated attention candidates — never a search of all Spaces; read a relevant Brief by projectId with penny_read. Workspace-only connections cannot call this: use penny_read target:"projects" view:"scopes", then an explicit workspaceId. projectKey is a repository subconscious block, not a Penny Project.

ParametersJSON Schema
NameRequiredDescriptionDefault
tzNoIANA timezone for deriving today/overdue date boundaries (e.g. America/New_York). Defaults to UTC when omitted.
projectKeyNoIncludes only the matching subconscious:<projectKey> block; other subconscious blocks are always excluded.
installedSkillSha256NoExact metadata.bundle_sha256; report absent metadata as unversioned.
installedSkillSourceNoHow the skill is managed; plugin copies update through the plugin manager, standalone copies through approved archive installation.
installedSkillStatusNoReport after reading the installed Penny skill. Omission is retained only for legacy clients and returns not_reported.
installedSkillVersionNoExact metadata.version from the installed skill; omit if missing or unversioned.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already carry readOnlyHint=true and idempotentHint=true, so the bar is lower, yet the description still adds substantial behavioral context: it must be called before the first reply, the agent must read the installed skill first and 'Do not guess metadata from the plugin or catalog version,' profile blocks are 'never truncated; treat these as authoritative,' digests are 'capped' and may set 'meta.truncated.*,' and there is an explicit 'Inspect one payload, not both text and structured copies' nuance. No contradiction with annotations.

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

Conciseness2/5

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

The description is a single dense wall of 600+ words with no paragraph breaks, the purpose is not front-loaded (the first sentence is prerequisite protocol, not the function), and there is clear redundancy — 'consult it before choosing an entityType in penny_write' appears twice and the return value is described twice ('Returns a single orientation snapshot' and later 'Returns your working inventory'). The content is high-value but poorly edited.

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?

With no output schema and six optional parameters on a complex orientation tool, the description carries full burden and succeeds: it describes return sections (profile blocks, self_improvement, rhythms.due, trackers, skills.defined, features, projects, working inventory), conditional behaviors (onboarded, saveDrought), truncation handling with drill-down paths, environment restrictions, and the effect of each optional parameter. An agent has everything needed to call it correctly on the first attempt.

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 baseline is 3, but the description adds real semantic value beyond the schema: it clarifies why tz matters ('so the task digest's Today/Overdue counts and dueNow list are computed in the user's local time'), disambiguates projectKey ('a repository subconscious block, not a Penny Project'), and explains the reporting logic for the skill-metadata parameters ('report absent metadata as unversioned,' 'omit if missing or unversioned').

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 states a specific purpose — 'Returns a single orientation snapshot of the user's world so you begin already aware' — with a clear resource (profile blocks, rhythms, trackers, skills) and differentiates from siblings by name (penny_read for drill-down, penny_start_setup for onboarding, penny_write for entity creation). However, the purpose statement is buried deep in the text; the opening is about prerequisites, forcing the agent to read hundreds of words to extract the core function.

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?

Usage guidance is explicit and exceptional: 'Call this ONCE at the very start of every conversation, before your first substantive reply' states when, and 'Workspace-only connections cannot call this: use penny_read target:"projects" view:"scopes", then an explicit workspaceId' states when not to, with the exact alternative. It also routes conditionally to siblings ('`meta.onboarded` false → offer setup via penny_start_setup', 'drill into them with penny_read') and explains when to pass tz and projectKey.

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

penny_start_setupA
Idempotent
Inspect

Run the first-run setup interview with the user. Returns a short interview script (how to address them, who they are, communication preferences, current focus) for you to ask conversationally and save with penny_write (entityType:"profile"), plus a custom-instructions snippet for the user to paste into their AI app so future conversations use these notes. Calling this marks onboarding complete (see penny_read target:"profile" meta.onboarded), so only call it when the user agrees to set up. Pass client when you know which app the user is in, to tailor the paste-here instructions.

ParametersJSON Schema
NameRequiredDescriptionDefault
clientNoOptional client hint: 'claude-desktop' | 'chatgpt' | 'claude-web' | other. Tailors the snippet's where-to-paste guidance.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond annotations, the description discloses a significant side effect: 'Calling this marks onboarding complete.' It also explains the tool does not persist data itself but instructs the agent to save with penny_write, and that the client parameter tailors the returned snippet. This adds meaningful behavioral context not available from readOnlyHint/idempotentHint/destructiveHint alone.

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

Conciseness5/5

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

Three sentences deliver all essential information: purpose, return content, side effect, precondition, and parameter guidance. The longest sentence is dense but every clause earns its place, and the most critical side-effect warning ('only call it when the user agrees to set up') is front-loaded.

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?

With no output schema, the description fully explains the return values (interview script and snippet) and the follow-up action (save with penny_write). It covers side effects, preconditions, and parameter behavior, making it complete for an agent to decide when to call and what to do afterward.

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?

The schema already documents the `client` parameter at 100% coverage. The description adds practical context about when to pass it ('when you know which app the user is in') and why ('to tailor the paste-here instructions'), which goes beyond the schema's basic type and enumeration guidance.

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: 'Run the first-run setup interview with the user.' It then details exactly what is returned (interview script plus custom-instructions snippet), clearly distinguishing this tool from siblings like penny_read, penny_write, and penny_session_start.

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

Usage Guidelines4/5

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

The description gives an explicit trigger condition: 'only call it when the user agrees to set up.' It also references checking penny_read target:'profile' meta.onboarded to understand state. However, it does not explicitly state exclusions like 'do not call if already onboarded' or name alternatives such as penny_session_start for ongoing conversations.

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. Write something new to the user's memory. Choosing entityType — walk this ladder top to bottom, first match wins:

  1. Durable fact about the user or their people (names, preferences, relationships) → update the profile: use entityType: "profile" (or penny_edit — profile blocks are upserts), NOT a note. Two blocks carry standing instructions: how they want to be remembered (stop saving X, always track Y, check notes before answering about Z, don't surface W unasked) → blockName: "memory_policy", as a general rule in their words; how they want you to show up (tone, register, manner) → blockName: "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. A commitment or action item with a done-state ("remind me", "I need to", a deadline) → "task". Areas/projects/headings that organize tasks → "area" / "project" / "heading". A to-do the user mentions, even in passing, is a task: offer to capture it, then write it. "project" also opens or revises a Penny Project: create with patch.name (and patch.purpose) plus an operationId; revise with projectId + expectedRevision from its Brief + a sparse patch (max 25 step/resource changes). "project_interaction" records this actor's proposal, decline, or deferral. A pending_share_approval result 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. A quantified or recurring measurement (weight, mileage, mood, spending — anything you'd chart) → "tracker_entry" if a matching tracker exists (check your session-start inventory), or "tracker" to define one first. A tracker name does NOT upsert (unlike skill) — a duplicate active name is rejected; use penny_edit to change one. A measurement the user would log more than once is a tracker entry; if no tracker fits, propose one before logging.

  4. Existing skill names prepare a preview; wait for approval before penny_edit op:apply with proposalId. Reusable know-how to save once and invoke when it fits → "skill" (attach a trigger to make it a scheduled behavior — the legacy "rhythm"); running a saved skill on demand → "skill_invoke"; beginning a run of a scheduled one → "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. Everything else — context, events, ideas, things learned → "note". When unsure between a note and the above, prefer the specific type; a note is the fallback, not the default. Tag relations ("tag_relation") and attaching notes to tracker entries ("tracker_note_link") round out the menu. Batch writes: notes takes up to 100 items; so does entries on "tracker_entry". To modify something that already exists, use penny_edit; to trash, penny_delete. Reuse an existing tag before minting a new one. Tagging and linking conventions live in the MyPenny skill.

When saving notes (entityType:"note"), calibrate each note's confidence honestly to the SIGNAL, not the pipeline: 0.95 = explicit user statement; 0.80 = confirmed decision; 0.60 = reasonable inference; 0.40 = hedged or sleeptime-derived; 0.20 = weak signal. Every note must include sampleQuestions: exactly three short, natural-language questions for which that note would be a useful retrieval result. Derive them FROM the content you're about to write — three different ways the user might ask, in conversation, something this memory should answer. Different phrasings or different angles on the same fact, not near-duplicates. Write them in the user's voice (how they'd actually ask in chat), not as retrieval queries. Example: for the memory "user prefers APA citation style for academic writing", good sampleQuestions are ["What citation style should I use for the paper?", "How should I format references in my thesis?", "What's my usual academic style?"].

ParametersJSON Schema
NameRequiredDescriptionDefault
goalNoentityType:"rhythm" (required) — natural-language instruction: what the run should do. On entityType:"skill" this is `instructions`.
kindNoentityType:"tracker" (required) — habit | metric | goal | log | status | custom.
nameNoRequired 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.
tagsNoentityType:"task" — tags to attach.
unitNoentityType:"tracker" — unit of measure.
actorNoentityType:"task"/"area"/"project"/"heading" — who took the action (me|agent), written to the activity ledger.
childNoentityType:"tag_relation" (required) — the 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.
orderNoentityType:"task"/"area"/"project"/"heading" — sort order.
ownerNoentityType:"task" — assignee.
patchNoProject sparse changes; omitted fields stay. Max 25 step/resource changes.
scopeNoProfile: global|workspace. Projects: private; workspace requires workspaceId.
titleNoentityType:"task" (required) or "heading" (required) — the title/label.
areaIdNoentityType:"project" (required) — the area the project belongs to.
parentNoentityType:"tag_relation" (required) — the parent tag in the child_of edge.
sourceNoentityType:"note"/"tracker_entry" — provenance label (defaults 'conversation' / 'agent-mcp').
statusNoentityType:"task" — initial status.
whenAtNoentityType:"task"/"project" — schedule date (ms epoch).
contentNoentityType:"profile" (required) — the block content.
deliverNoentityType:"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' }.
entriesNotracker_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.
noteIdsNoentityType:"tracker_entry" — archival note ids to attach; or "tracker_note_link" (required) — the notes to link.
payloadNoentityType:"tracker_entry" (required unless `entries` is used) — the structured data point; shape is tracker-defined.
postureNoentityType:"skill" with a `trigger` set (or legacy "rhythm") — read | propose | act (defaults 'read').
skillIdNoentityType:"skill_invoke" (required, or pass `name`) — the skill to run now. entityType:"skill_run" — the skill to begin a run of (or pass `name`).
triggerNoentityType:"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[]}}.
deadlineNoentityType:"task"/"project" — hard due date (ms epoch).
rhythmIdNoentityType:"rhythm_run" — the rhythm to begin a run of (or pass `name`).
agentNoteNoentityType:"tracker_entry" (single-entry form only) — short caption on this one data point (not searchable).
blockNameNoentityType:"profile" (required) — the profile block name to upsert.
dependsOnNoentityType:"task" — full replacement set of taskIds that must complete first.
headingIdNoentityType:"task" — heading to file the task under.
linkNotesNoentityType:"task" — note ids to link to this task.
projectIdNoentityType:"task" — parent project; or "heading" — the project it belongs to (required).
reasoningNoentityType:"tag_relation" — short justification (typically a user quote) for the edge.
trackerIdNoentityType:"tracker_entry" (required) — the tracker to log against.
entityTypeYesWhat to create. Walk the ladder in the tool description; first match wins.
recordedAtNoentityType:"tracker_entry" (single-entry form only) — observation time (ms epoch; defaults to now).
recurrenceNoentityType:"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.
targetSpecNoentityType:"tracker" — JSON target spec, interpreted at retrieval (e.g. { kind: 'daily_minimum', value: 10000 }).
whenBucketNoentityType:"task"/"project" — undated bucket; mutually exclusive with whenAt.
descriptionNoentityType:"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.
interactionNoproject_interaction: actor decision; read first, update with expectedUpdatedAt.
operationIdNoProject receipt key; identical retries only.
instructionsNoentityType:"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".
retrievalPlanNoentityType:"skill" (or legacy "rhythm") — OPTIONAL deterministic steps [{ tool, args }] for a bounded tier.
trackerEntryIdNoentityType:"tracker_note_link" (required) — the logged tracker entry to attach notes to.
expectedRevisionNoProject edit revision from Brief; reconcile conflicts.
expectedUpdatedAtNoSource version from the read.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the description doesn't need to restate mutation. It adds substantial behavioral context beyond annotations: the confidence calibration ladder (0.95→0.20), the requirement for exactly three sampleQuestions in the user's voice, the tracker duplicate-name rejection behavior, the batch-write limits (100 items), and the 'receipts report each saved/failed item; do not claim all saved from a partial result' warning. It doesn't fully disclose all side effects (e.g., what happens on partial batch failure beyond receipts), but for a 49-param tool this is strong coverage.

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 description is long (roughly 500 words), but every sentence earns its place given the tool's 16 entityTypes and 49 parameters. It is front-loaded with the core purpose and the decision ladder, then progressively details each branch. The numbered ladder structure makes it scannable. It loses one point for density — the profile-block paragraph and the skill paragraph pack multiple rules into single sentences, which could be split for easier parsing — but it is not bloated or repetitive.

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 16 entityTypes, 49 parameters, nested objects, and no output schema, the description is remarkably complete. It covers the decision procedure (ladder), the data-quality requirements (confidence, sampleQuestions), the sibling routing (penny_edit, penny_delete), the batch semantics, and the project revision flow (expectedRevision, operationId). The only minor gap is that it doesn't describe the return shape, but with no output schema and the receipts warning, the agent has enough to call correctly. Nothing critical is missing.

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 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the entityType ladder that determines which parameters are relevant, and by giving concrete examples for sampleQuestions ('What citation style should I use for the paper?'). It also clarifies semantic nuances the schema can't: 'A tracker name does NOT upsert (unlike skill)', 'profile blocks are upserts', and 'a note is the fallback, not the default'. It doesn't document every one of the 49 parameters, but the schema already does that; the description's job is to explain selection logic, which it does thoroughly.

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 vivid, specific verb phrase ('Save the moment something durable emerges') and immediately names the resource ('the user's memory'). It then enumerates the full entityType ladder with concrete examples (decision, preference, plan, correction, to-do, measurement), which distinguishes this write tool from siblings like penny_read and penny_edit. The 'first match wins' ladder is a clear decision procedure, not a vague restatement.

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?

The description is explicit about when to use this tool vs alternatives: it says to use penny_edit for modifications, penny_delete for trashing, and names the profile-block upsert path. It gives conditional routing ('if no tracker fits, propose one before logging', 'when unsure between a note and the above, prefer the specific type'). It also states when NOT to save (pending_share_approval is a proposal, not a save). This is the strongest possible usage guidance.

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. 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

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    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.
    4 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