log-reflect-mcp
The server lets an MCP client capture, store, and search personal Markdown journal entries and external input notes, backed by local or GitHub records.
Capture journal entries: create or append a personal journal fragment with a title, filename keyword, optional date, and Markdown content.
Save external inputs: store an article, book, podcast, video, course, or conversation as a Markdown note with optional tags, source, and date.
Retrieve by date range: read journal and input records within an inclusive YYYY-MM-DD range, optionally filtered to journal or input types.
Search records: run literal text searches across journal and input Markdown files, with optional date filters and result limit.
Portable storage (per README): records are plain Markdown in
journals/,notes/, andreviews/; images can be attached, normalized, and stored beside records; metadata indexes are rebuildable.Broader hosted tools (per README, not in provided schema): the full project can also save reviews, compute record connections, provide Bubble Breaker context, and issue GitHub setup/account-switch links.
Provides GitHub-backed storage for personal Markdown records, allowing the server to read, write, search, and append journal and input records in a designated GitHub repository.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@log-reflect-mcpsearch my journal for mentions of 'focus' this month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Capture & Reflect
capture-reflect-mcp is the open-source MCP server behind Capture & Reflect, a personal capture and reflection system. It lets an AI client capture and retrieve Markdown journal entries and notes, including photo attachments, through natural language while keeping the records in a separate local or GitHub repository.
It is designed to work with the directory conventions used by capture-reflect-practice:
journals/{YYYY}/{YYYYMM}/
notes/{YYYY}/{YYYYMM}/
reviews/Hosted quick start
Before connecting Capture & Reflect, create a dedicated GitHub repository for your records:
On GitHub, create a new repository. A private, empty repository is recommended for personal records. You do not need to add a README,
.gitignore, or license; Capture & Reflect can initialize a repository with no commits.Connect your AI client to
https://api.bysunling.com/mcpand complete OAuth. See the client-specific instructions below.Ask the client to save a journal entry or note. On first use, open the secure GitHub setup link returned by Capture & Reflect.
Authorize the Capture & Reflect GitHub App. For the narrowest access, choose Only select repositories and select the dedicated records repository.
Choose that repository, confirm your time zone, and click Save & connect. Capture & Reflect creates the canonical
journals/,notes/, andreviews/directories automatically.Try “Dear diary, today...”, “Save this thought: ...”, or “What did I write about moving?”
An existing repository also works, and existing files are not replaced. A dedicated repository is recommended because it keeps personal records separate and limits the GitHub App's access to only the data it needs. Record Markdown and images are written directly to the selected repository; they are not copied into the hosted service's database.
Related MCP server: ai-journal
Your records remain usable without this MCP
No MCP required. No ID required. No database required. Markdown files, images, and ordinary relative Markdown links in your records repository are the durable assets. Capture & Reflect helps write and explore them; it is not required to keep using them.
Keep writing normally. If the hosted MCP stops working or is discontinued, clone or download the records repository, open it in Obsidian or another Markdown editor, and create/edit
.mdfiles. You do not have to generate an ID by hand or export a proprietary database. Use standard links such as[related note](another-note.md)to connect records.IDs are optional metadata. Capture & Reflect assigns a stable
id: cr_<uuid>in YAML frontmatter when it creates a new journal, note, or review; appending to an existing journal preserves its ID. Older files and hand-written Markdown without IDs remain valid. An ID does not replace the file path or make ordinary Markdown links immune to renaming.Links are the source of graph relationships. The read-only
get_record_connectionstool accepts an exact repository-relativepathor an optionalidand derives outgoing links, backlinks, and unresolved targets from standard relative Markdown links in record bodies. It does not add reverse links to other files or maintain a graph database. It does not infer relationship types or treat a link as the user's endorsement of an AI suggestion.Reviews preserve evidence separately. A review's
source_pathslists the journal and note files consulted for the reviewed period. That is provenance, not an assertion that every record shares a meaningful idea. The review body can link specific records beside an observation and explain why they matter. The graph tool currently derives edges from body links, not fromsource_paths; no typed relationship schema is required.Indexes are disposable.
.capture-reflect/search metadata can be rebuilt from Markdown; graph connections are computed from files at query time. Removing an index never removes the original note or its links.
Current limitations: graph lookup scans all discoverable records and may be slower for large repositories. The MCP record reader currently recognizes date-prefixed record filenames, so manually created journals should follow YYYYMMDD.md and notes should follow YYYYMMDD-short-topic.md under the canonical folders to be found by MCP search/graph tools; older date-prefixed journal filenames remain supported. Obsidian and other editors do not require these conventions. Standard relative links must be repaired if a file is moved or renamed by a tool that does not update references automatically. The graph parser supports common inline and reference-style Markdown links, not Obsidian-only [[wikilinks]] or every advanced Markdown syntax. No automatic backfill of old IDs, automatic AI relationship creation, or relationship-type taxonomy is implemented.
See the portable knowledge graph design and MCP outage walkthrough for examples and the exact boundaries.
Current scope
The local server exposes seven record, graph, and context tools. The hosted service also exposes secure setup and account-switch tools:
capture_journal: create or append a personal journal entry fragment, with optional photos.capture_note: save a structured Markdown note preserving the original text, with optional body-only source details, related journals or notes, AI-labeled reflections and possible actions, and photos.get_records_by_date_range: retrieve journals and notes, or saved reviews withtypes: ["review"](filtered by save date).save_review: save a review and validated source links underreviews/, without overwriting.search_records: search journals and notes by default; usetypes: ["review"]for earlier reviews.get_record_connections: read standard Markdown outgoing links, backlinks, and unresolved targets by exact path or optional ID; does not write records.get_bubble_breaker_context: read recent journals and notes, current date/time, and the Bubble Breaker workflow; defaults to the last seven calendar days in the configured time zone.get_github_setup_link: authorize a GitHub App and choose a per-user records repository.get_github_account_switch_link: open GitHub account selection directly, including when the old authorization has expired.
The MCP server handles access and storage. It publishes four focused Agent Skills through the MCP Skills extension so supported AI clients can discover their instructions and resources:
capture-record: route one journal entry or note, preserve the user's voice, and pass uploaded photos through.review-records: review a date range and save its sources, patterns, questions, and reflections unless chat-only output is requested.recall-records: search before answering questions about earlier records.bubble-breaker: discover one verified unfamiliar resource, record completion with minimal effort, or explore perspectives, blind spots, connections, and questions.
Note capture workflow
The capture skill passes the user's text verbatim as structured originalNote. The server renders an Original note section plus optional Source, Related records, Further reflection (AI), and Possible actions (AI) sections, with headings in the note's language. Related records may be journals or notes. Source details are rendered only in the body, not duplicated in YAML.
Before saving, the client starts with one focused search_records query across journals and notes and only runs another when the first result is clearly insufficient, with at most three searches total. It reads the results and includes up to three meaningful connections total with verified dates, exact returned paths, and exact excerpts. Search currently matches literal text; it may miss related experiences or ideas expressed differently. Empty sections are omitted, and a failed lookup does not prevent saving the original note. Users can skip enrichment.
Search and connection selection remain a client workflow defined by the bundled skill and tool instructions. capture_note accepts structured fields rather than arbitrary Markdown, and the storage layer consistently renders the sections while preserving originalNote verbatim.
Capture routing follows the intended subject rather than isolated trigger words. Lived experiences and feelings go to capture_journal; technical observations, measurements, product tests, debugging findings, and design decisions go to capture_note, even when they discuss journals or the recording workflow itself. An explicit request to save something as a journal overrides the inferred subject.
Sharded GitHub search index
GitHub-backed repositories use a sharded search index under .capture-reflect/index/. The manifest references smaller shards grouped by record type and year; nonstandard paths use deterministic hash buckets. Captures update only the affected shard and the manifest in the same atomic commit as the Markdown record and any images.
The first search creates the index. Later searches validate per-shard digests against the current Git tree and rebuild stale metadata from changed records. Markdown under journals/, notes/, and reviews/ remains the source of truth; all .capture-reflect/ data is rebuildable.
Bubble Breaker workflow
Ask “Surprise me with something new.” The client explores varied domains and sources with its own web tools, independently of inferred interests. Before recommending one verified resource, it uses get_bubble_breaker_context and focused search_records queries to filter familiar territory and repeats. History filters candidates; it does not determine every destination. The MCP does not browse or generate recommendations itself. Other modes are challenge, blindspot, connect, and socratic.
Recommendations stay in chat. Once you explicitly report completion, the client checks notes for an existing completion and saves a minimal record through capture_note, using the single stable bubble-breaker tag and no automatic record enrichment or required summary. The generated YAML frontmatter holds the stable ID, factual resource title, resolved date, and tag; structured source details, including a canonical URL when known, appear in the Markdown body. It preserves user-supplied thoughts verbatim, or uses one short localized completion marker because capture_note.originalNote cannot be empty. The configured time zone replaces the reference skill's fixed time zone. Search-based duplicate checks are not atomic; existing notes cannot be appended, so an explicitly requested repeat completion can be saved separately. Scheduling requires a supported client.
Terminology
journal entry,note,review, andrecordrefer to one item.recordsrefers to a collection of journal entries and notes.journals/,notes/,reviews/, andimages/refer to actual directories. Directory names are always lowercase, plural, wrapped in backticks, and include a trailing slash.Skill names follow their operation:
capture-recordwrites one record, whilerecall-recordsandreview-recordsmay work across multiple records.
Language support
The interface, tool names, and public metadata are English-first. Record content is multilingual: titles, Markdown bodies, source text, quotations, and filename keywords may use Unicode and keep the user's original language and code-switching. Capture tools do not translate unless the user explicitly asks. Recall and review responses follow the language of the current request while preserving source-language quotations.
New journal filenames use {YYYYMMDD}.md without a topic keyword or language-specific weekday. New note filenames retain {YYYYMMDD}-{keyword}.md; older journals keep their filenames and receive same-day appends. Filename keywords support Unicode letters, combining marks, and numbers. Image attachments accept an optional alt description in the user’s language, falling back to the filename stem or an empty description. See the file naming guide.
Example requests include “Dear diary, today...”, “Save this thought: ...”, “What stood out this week?”, and “What did I write about moving?” These are English examples, not a requirement to write records in English.
Safety boundaries
The source repository contains no personal records or credentials.
The server can only read
journals/,notes/, andreviews/. Reviews must be requested explicitly and are excluded from default reads and searches.New records are written only inside those three directories. Reviews are create-only; source paths must identify existing journals or notes within the reviewed period.
Existing note files are never silently overwritten.
If more than one journal file exists for a date, the write stops instead of guessing.
Each capture accepts up to five image attachments. Images are resized to fit within 2048 × 2048 pixels, metadata is removed, and the processed file must be no larger than 10 MB.
GitHub credentials are read from the environment and are never written into records.
Connect to the hosted MCP
The hosted Capture & Reflect MCP is available at:
https://api.bysunling.com/mcpA supported remote MCP client can connect to this endpoint and complete OAuth. On first use, Capture & Reflect provides a secure GitHub setup link so the user can authorize the GitHub App, choose the repository where records should live, and save the detected time zone.
Account selection during Connect
For GitHub account and repository selection before returning to ChatGPT, enable the optional Standalone Connect flow. This requires WorkOS configuration, a server API key, a GitHub callback and email permission, and explicit migration of existing identities. Deploying code alone does not enable it. Once activated, disconnecting and reconnecting the plugin starts GitHub account selection; the separate setup tool remains available for repository changes within that account.
Switch GitHub accounts with the original hosted-auth flow
Ask “Switch the GitHub account for my records”. The client calls get_github_account_switch_link and returns a fresh link that opens GitHub's account picker directly. Select or sign into the desired account, then choose a repository and click Save & connect. The general get_github_setup_link page also shows the current username and Use a different GitHub account. Grant the GitHub App access to that repository if needed.
Disconnecting the plugin in ChatGPT does not clear the server's saved GitHub connection. Account switching uses GitHub's account picker and does not require clearing browser cookies. The old connection remains until authorization succeeds; successful reauthorization clears the previous repository selection, so a repository must be selected before captures resume. Existing records stay in their original repository.
Claude
In Claude:
Open Customize → Connectors.
Choose Add custom connector.
Name it
Capture & Reflectand usehttps://api.bysunling.com/mcpas the MCP URL.Connect and complete OAuth.
The first time you save a record, follow the GitHub setup link and choose your records repository.
ChatGPT
In ChatGPT with Developer mode available:
Open Settings → Security and login and enable Developer mode.
Open Plugins and create a developer plugin connected to the hosted MCP endpoint.
Use
https://api.bysunling.com/mcpas the MCP URL, then complete OAuth and tool scanning.The first time you save a record, follow the GitHub setup link and choose your records repository.
Once connected in either client, try: “Dear diary, today...”, “Save this thought: ...”, “What stood out this week?”, or “What did I write about moving?”
The same hosted MCP can be used by other AI clients that support remote MCP with OAuth.
Local development with ChatGPT
For local development with ChatGPT, use the local HTTP server plus ChatGPT's Secure MCP Tunnel. This keeps the unauthenticated development endpoint on your own computer.
Requirement: Node.js 22 or later. A local clone of your records repository is needed only for local storage.
npm install
cp .env.example .env
npm run buildFor backward compatibility, the default local path remains ~/.log-reflect/records; it is
created on the first write. To use an existing local records repository instead, set its absolute path as
RECORDS_REPO_PATH in .env.
Store records directly in GitHub
Create a fine-grained personal access token for only the records repository. Grant it
Contents: Read and write; no broader account or organization permissions are needed. Keep
the repository private if the records are personal, and put the following values in .env:
RECORDS_STORAGE=github
RECORDS_GITHUB_REPOSITORY=YOUR_GITHUB_USERNAME/YOUR_RECORDS_REPOSITORY
RECORDS_GITHUB_TOKEN=github_pat_...
RECORDS_GITHUB_BRANCH=main
RECORDS_TIME_ZONE=America/Los_AngelesEach capture creates a GitHub commit immediately. Journal
fragments for the same day are appended to the existing file with conflict retries; an existing
note is never overwritten. Reading and search remain limited to journals/, notes/, and explicitly requested
reviews/.
The GitHub token used by this MCP server is separate from any GitHub connector authorization in
an AI client. Never commit .env; it is already excluded by .gitignore.
Load the environment and start the Streamable HTTP endpoint:
set -a
source .env
set +a
npm run start:httpCheck that it is running:
curl http://127.0.0.1:3000/healthNext, create a tunnel in OpenAI Platform tunnel settings, run tunnel-client on this computer, and configure its HTTP target as:
http://127.0.0.1:3000/mcpKeep both npm run start:http and tunnel-client run --profile <your-profile> running. Then open Settings → Security and login → Developer mode in ChatGPT. On the ChatGPT Plugins page, create an app, choose Tunnel, and select or paste your tunnel_id. See the Secure MCP Tunnel guide for installing and initializing tunnel-client.
Once connected, try: “Dear diary, today...”, “Add this photo to today's diary”, “Save this thought: ...”, “What stood out this week?”, or “What did I write about moving?”
ChatGPT plugin packaging
The first ChatGPT connection creates an app identifier such as plugin_asdk_app.... That identifier is intentionally not committed here. It can later be placed in .app.json when packaging the final installable plugin.
Official references: Build an MCP server, connect it to ChatGPT, and package a plugin.
Photo attachments
In a supported AI client, attach one or more images to the message that asks to record a journal entry or save a note. Supported source formats are JPEG, PNG, WebP, HEIC, and AVIF. The client passes a temporary file URL to the plugin, which normalizes the image and stores it beside the Markdown record:
journals/{YYYY}/{YYYYMM}/images/
notes/{YYYY}/{YYYYMM}/images/The record contains relative Markdown image links, so it remains portable when the records repository is cloned or viewed on GitHub. Original EXIF metadata is not retained. Non-image attachments are rejected in this version.
The local HTTP endpoint uses no authentication and binds to
127.0.0.1by default. Do not expose it directly to the public internet. The Netlify entrypoint undernetlify/functions/is the authenticated production endpoint.
Hosted production deployment
The production architecture uses WorkOS AuthKit for MCP OAuth, a GitHub App for per-user repository access, Supabase for encrypted connection metadata, and Netlify Functions for the public HTTPS endpoint. Journal bodies and images are written directly to the repository selected by the user; they are not copied into Supabase.
Create a WorkOS AuthKit project. Enable CIMD and dynamic client registration, set the resource indicator to the stable public origin, and configure that origin as the default resource.
Create a public GitHub App with Contents: Read and write and Metadata: Read repository permissions. Enable expiring user tokens. Set the callback URL to
/github/callbackand setup URL to/github/installedon the public origin.Create a dedicated Supabase project and apply
supabase/migrations/20260901051620_create_user_connections.sql.Create a Netlify site from this repository, attach the stable custom domain, and configure every variable in
.env.production.exampleas a secret environment variable.Connect
https://YOUR_DOMAIN/mcpin a supported AI client, complete any required domain verification, scan the tools and Skills, and run the review test cases.
When a user saves a repository connection, Capture & Reflect initializes any missing canonical directories with harmless .gitkeep files:
notes/
journals/
reviews/Git does not track empty directories, so these marker files make the structure visible before the first record. Existing files are never replaced. A repository with no commits is initialized on its default branch.
Scheduled reviews
The MCP server is passive: it exposes record and review capabilities but does not wake itself up on a schedule. The simplest hosted workflow is a scheduled task in a supported AI client that periodically invokes the review-records Skill, reads the chosen date range with get_records_by_date_range, and returns the review.
When no period is specified, reviews default to the last seven calendar days including today in the configured time zone (today minus six days through today). User-specified ranges or named periods take precedence. Omit both from and to on get_records_by_date_range to use the server default, or provide both for a custom inclusive range. The response includes the resolved from, to, and timeZone; reuse those dates when saving.
The review skill finishes by calling save_review unless the user requests chat-only output. Reviews are saved as reviews/YYYY/YYYYMM/FROMYYYYMMDD-TOYYYYMMDD-keyword.md, with the save date, reviewed range, source paths and links, and the full review body. The directory uses the save date; the filename uses the reviewed range and a topic keyword in the user’s language, for example reviews/2026/202609/20260905-20260911-after-plans-changed.md. Existing reviews retain their filenames. Source links reference current entries rather than immutable snapshots. User thoughts remain distinct from AI interpretations. Empty periods are not saved; sparse evidence is labeled. Existing reviews are never overwritten. Retrieve earlier reviews with types: ["review"]; date filters use the save date, while the reviewed period is stored in from/to metadata. A self-hosted alternative is a Netlify Scheduled Function plus an AI model call, but that adds model credentials, scheduling, retries, and delivery handling to this service.
Never expose SUPABASE_SECRET_KEY, GITHUB_CLIENT_SECRET, TOKEN_ENCRYPTION_KEY, or SETUP_TOKEN_SECRET to a browser. Generate the latter two independently with a cryptographically secure random generator.
Local stdio setup
Requirements: Node.js 22 or later.
npm install
cp .env.example .envOptionally set the absolute path to an existing records repository. If it is omitted, the
server uses ~/.log-reflect/records:
RECORDS_REPO_PATH=/absolute/path/to/capture-reflect-practiceBuild and start the stdio server (for Claude Desktop, Codex, and other local MCP clients):
npm run build
RECORDS_REPO_PATH=/absolute/path/to/capture-reflect-practice npm run start:stdioExample client configuration
After building, point an MCP client at the compiled server:
{
"mcpServers": {
"capture-reflect": {
"command": "node",
"args": ["/absolute/path/to/capture-reflect-mcp/dist/src/server.js"],
"env": {
"RECORDS_REPO_PATH": "/absolute/path/to/capture-reflect-practice",
"RECORDS_TIME_ZONE": "America/Los_Angeles"
}
}
}
}For GitHub-backed stdio, replace RECORDS_REPO_PATH in the client environment with
RECORDS_STORAGE, RECORDS_GITHUB_REPOSITORY, RECORDS_GITHUB_TOKEN, and
RECORDS_GITHUB_BRANCH as shown above.
Development
npm run check
npm testRun the weekly review flow through the built HTTP server:
npm run test:e2e:reviewThis starts a separate server on a temporary localhost port and uses a scripted MCP client to initialize, capture test notes and a journal, read two date ranges, reproduce source-validation errors, save a corrected review, read it back, and verify overwrite protection. It checks HTTP 200 separately from MCP isError, verifies the saved Markdown on disk, and prints per-request timings. The test uses an isolated temporary records directory, does not load .env, and stops the server and removes test records afterward. It requires permission to bind a localhost port. It does not exercise AI generation, live GitHub, hosted authentication, or the Netlify runtime.
To run the same HTTP checks with real GitHub records, authenticate gh with read access to the repository, then run:
npm run test:e2e:review -- --github sunling/sunling-osThis regression scenario reads journals and notes dated September 1–14, 2026 through GitHubRecordsStore, using September 8–14 as the reviewed period and September 1–7 as comparison material. It requires records in both periods. The script copies exact contents and paths into temporary local storage and verifies HTTP reads against the fetched contents. GitHub requests are restricted to reads; all review saves happen locally. It prints counts, sizes, and timings without printing real filenames or bodies on a successful test run. The review body is a test inventory, not an AI-generated personal review. No GitHub credential is passed to the local HTTP server.
To inspect the tools interactively:
npx @modelcontextprotocol/inspector node dist/src/server.jsRoadmap
Add MCP resources for reading individual records.
Complete domain verification, privacy policy, tool scanning, test prompts, and ChatGPT plugin review.
Add scheduled reflection and automated Bubble Breaker delivery.
Available Tools
4 toolscapture_inputC
Save an external input such as an article, book, podcast, video, course, or conversation as a Markdown note.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD; defaults to today | |
| tags | No | ||
| title | Yes | ||
| source | No | ||
| content | Yes | Markdown note body | |
| keyword | Yes | Filename keyword without spaces or slashes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose side effects and expectations. It only says 'Save' without explaining write privileges, overwrite behavior, filing conventions, or response format. The saved note's storage details are entirely omitted, leaving an agent unaware of potential errors or constraints beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, front-loading the primary action. It avoids redundancy and is easy to scan. It loses a point for omitting any structural hints about optional fields or examples that would aid comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters and no output schema or annotations, the description is far too minimal. It does not explain the purpose of filename keyword constraints, source handling, tag limits, or how the note is persisted. An agent would need additional information to correctly invoke all parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no parameter-specific guidance. Schema coverage is 50% (only date, content, keyword have descriptions), and the tool description fails to clarify the roles of title, source, or tags, or to supplement what the schema does provide. The phrase 'Markdown note' hints at content, but not enough to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Save'), a resource ('external input'), and the output format ('Markdown note'). It lists example inputs (article, book, podcast) making the purpose unambiguous. However, it does not explicitly distinguish from sibling 'capture_journal', so it loses some differentiation credit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. The description does not mention capture_journal or any conditions for selecting this over other capture/search tools. An agent would not know whether this is appropriate for a specific scenario without further inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_journalB
Create or append a personal journal fragment. Supply lightly edited content that preserves the user's words and uncertainty.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD; defaults to today | |
| title | Yes | Short factual fragment heading | |
| content | Yes | Markdown journal body without summaries or tags | |
| keyword | Yes | Filename keyword without spaces or slashes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does reveal a write operation ('create or append') and a light-editing philosophy, which is genuine behavioral context. However, it does not disclose how the tool decides append vs. create, whether it is idempotent, auth requirements, or what it returns — gaps that matter for a write tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler. The purpose is front-loaded in the first sentence, and the second sentence carries the only substantive addition (editing guidance). Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter write tool with no annotations and no output schema, the description is thin but the schema is fully self-documenting. The main gaps are the append-vs-create decision logic and the missing differentiation from capture_input in the sibling set, neither of which the schema can compensate for.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 even without parameter detail in the description. The description reinforces the content parameter's meaning via 'lightly edited content,' but adds nothing about keyword-as-filename, date defaults, or title that the schema already explains. It does not exceed the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create or append a personal journal fragment.' This clearly separates it from the read-oriented siblings get_records_by_date_range and search_records. However, it does not distinguish itself from the near-namesake capture_input, leaving the agent to guess how journal capture differs from general input capture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The instruction to 'Supply lightly edited content that preserves the user's words and uncertainty' provides useful guidance on how to phrase the content body. But there is no when-to-use guidance versus capture_input, and no conditions under which one should be preferred over the other, so an agent selecting between the two capture tools gets no help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_records_by_date_rangeA
Read journal and input records within an inclusive date range.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Inclusive end date in YYYY-MM-DD | |
| from | Yes | Inclusive start date in YYYY-MM-DD | |
| types | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral disclosure burden. It states the operation is a read and that the date range is inclusive, but it does not mention return format, pagination, default behavior when 'types' is omitted, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no filler. The verb and resource appear immediately, and every word ('inclusive', 'date range') adds relevant meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description leaves the return shape and default behavior unstated, and the relationship to search_records is unexplored. Still, for a straightforward date-range read, the schema plus description provides a minimally viable definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents from/to with inclusive YYYY-MM-DD formats. The description adds that records are journal/input, which aligns with the optional types enum, but does not clarify the default filtering behavior when types is omitted. With 67% schema coverage, the description partially compensates but not fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Read') and resource ('journal and input records') with a date-range scope, making the tool's query purpose obvious. It distinguishes itself from the capture_* siblings by being a read operation, though it does not explicitly contrast with search_records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when records need to be read within an inclusive date range. However, it provides no explicit exclusions or alternatives, leaving the choice between this tool and search_records to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_recordsC
Search journal and input Markdown files for matching text.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ||
| from | No | ||
| limit | No | ||
| query | Yes | ||
| types | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states the tool searches for matching text but does not disclose case sensitivity, exact vs. fuzzy matching, result ordering, pagination, or any side effects. The agent is left without critical runtime behavior information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that is front-loaded with the core action and target. It is efficient in word count, but it omits essential details, so while it is concise, it is not comprehensive. It earns a 4 for brevity without waste, but lacks the structural depth expected for a tool with multiple parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters, no output schema, and no annotations, the description is grossly incomplete. It fails to explain how to form a query, what valid input types are, the semantics of date filters, or the response format. An agent would struggle to invoke this tool correctly without further information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, and the description does not explain any of the five parameters. It does not clarify what 'query' means, how 'from'/'to' are formatted, what 'limit' controls, or how 'types' restricts the search. The only loose hint is 'journal and input' which vaguely maps to the types enum, but this is not explicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches journal and input Markdown files for matching text, specifying both the action and the resource types. However, it does not differentiate from sibling tools like get_records_by_date_range, which could also involve searching or retrieving records, so it lacks distinguishing context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. It does not mention any conditions, prerequisites, or scenarios where this search tool is preferred over capture or date-range retrieval tools. The agent receives no help in selecting the correct tool.
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.
4 tool updates
v0.1.0- First observed
capture_input - First observed
capture_journal - First observed
get_records_by_date_range - First observed
search_records
TDQS
Scored across 4 tools
Each tool has a unique, non-overlapping purpose: capturing journal entries vs. external inputs, and reading by date vs. searching by text. The boundaries are clear, and an agent would rarely misselect between them.
All tools use a consistent snake_case verb_noun pattern. 'get_records_by_date_range' is slightly longer but still follows the same style as 'capture_journal' and 'search_records', with no mixed conventions.
With 4 tools, the server is well-scoped for its purpose of logging and retrieving reflections. Each tool serves a necessary function, and the count is neither too thin nor bloated.
The set covers the core capture and retrieval workflows for journaling and external inputs. Minor gaps exist (e.g., no explicit update/delete, no single-record get by ID), but agents can work around these via search and date-range queries.
Maintenance
Related MCP Connectors
Personal context for every AI: search, read, and write back to your private Markdown library.
Search, read, and safely update Markdown notes in your connected Phasoric knowledge vaults.
Portable AI memory shared across models and harnesses - plain markdown you own.
Track, curate, and analyze data about your health, habits, and goals.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables creating, managing, and searching Markdown notes with support for tags, timestamps, and full-text search. Includes AI prompts for analyzing and summarizing notes.61MIT
- AlicenseNot gradedqualityBmaintenanceA local MCP server for journaling, organizing, and recalling your work. It captures entries as plain markdown files, indexes them for full-text and structured search, and enables querying via natural language.1MIT
- AlicenseNot gradedqualityDmaintenanceProvides persistent long-term memory for AI assistants with tag-based retrieval, wiki-style linking, and source references, storing memories as markdown files with SQLite index.1MIT
- FlicenseNot gradedqualityDmaintenanceEnables writing text content to Markdown files with folder organization and overwrite control, and listing recent Markdown files.-