Skip to main content
Glama

penny_read

Read-onlyIdempotent

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.

Input Schema

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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema 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."
  2. Changed1 schema 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"
      +}
  3. Changed4 schema 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."
  4. Changed31 schema 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."
  5. Changed3 schema 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."
  6. Changed1 schema field changed
    • addedInput schema / properties / ifRevision
      Added value: +{
      +  "description": "profile: the revision from your last read; returns {unchanged:true} if nothing changed.",
      +  "type": "string"
      +}
  7. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources