Fix stats tool validation failures#28
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
Fixes two stats-related MCP failures:
notes.readwithinclude: ["stats"]now returns schema-compatible numericheadingsandlinksvalues while preserving the underlying count aliases.stats.vaultnow skips individual notes that fail per-note statistics parsing instead of failing the whole vault scan, and reports skipped note paths inskippedNotes.This is user-visible as previously failing stats calls now return structured results.
Closes #26
Closes #27
Why
notes.readwas returning the richgetNoteStatistics()shape directly. That shape uses object-valuedheadingsandlinks, but the registered MCP output schema expects numeric counts for those fields, causing output validation errors.stats.vaultalso treated any per-note stats error as fatal, so one malformed/frontmatter-like note could prevent vault-wide stats from returning at all.How
toNotesReadStats()adapter insrc/server/tools/notes.tsthat converts note statistics into the publicnotes.readschema shape.src/domain/statistics.tsso vault stats continue scanning and collect skipped note paths.tests/server-integration.test.tsfor both failing behaviors.What behavior is preserved
The domain-level
getNoteStatistics()return shape remains unchanged for internal callers.stats.vaultstill aggregates counts from successfully parsed notes.Risk remains
Skipped notes are excluded from aggregate totals. The response reports
skippedNotesso callers can see when totals are partial.How reviewers can verify it
Run:
bun run typecheck bun run lint bun run test bun run build