An MCP server for managing your personal knowledge, daily notes, and reusable prompts via GitHub Gists.
GistPad MCP demonstrates solid definition quality across 30 tools with consistent naming patterns (verb_noun structure), generally good descriptions (avg ~90 chars, well above minimum), and explicit JSON Schema input specifications. All tools are explicitly registered in src/tools/ with clear parameter types and descriptions. Tool names follow action-verb conventions (list_, get_, create_, update_, delete_, add_, remove_, archive_). However, output schemas are not documented in the provided code, return types are inferred from implementation context rather than explicitly declared for LLM consumption. Error handling guidance exists but is sparse; most tools lack recovery suggestions. Security posture is strong (GitHub token via env var, no secrets in parameters), but some high-risk operations (delete_gist, delete_gist_comment, delete_gist_file, delete_daily_note) lack confirmation or dry-run patterns. Descriptions are pragmatic but could better explain WHEN to use each tool vs. alternatives.
Add a comment to a gist
Add a new file to a gist
Add a new prompt to your gist-based prompts collection
Archive a gist by ID
Create a new GitHub Gist
Delete a specific daily note by date
Delete a GitHub Gist by ID
Destructive operations lack confirmation or dry-run patterns. delete_gist, delete_gist_comment, delete_gist_file, and delete_daily_note have no pre-execution confirmation step, increasing risk of accidental data loss from LLM mistakes.
Output schemas are not explicitly documented in the provided code. Return types are inferred from implementation context (e.g., get_gist returns full gist contents, list_gists returns array of gists), but LLMs cannot see structured response documentation in the tool definition. This forces LLMs to guess what fields are available for downstream tool calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 67 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 54 | - | v1 |
Delete a comment from a gist
Delete a file from a gist
Delete a prompt from your gist-based prompts collection
Create a copy of an existing gist
Update the content of an existing gist comment
Edit a file in a gist using find-and-replace. More efficient than update_gist_file for targeted changes. The old_string must uniquely identify the text to replace - if multiple matches exist, the edit will fail unless replace_all is true.
Get the contents for a specific/existing daily note
Get the full contents of a GitHub Gist by ID (including file contents).
Get or create the daily note for today's date (for tracking todos, tasks, scratch notes, etc.)
List all of your archived gists
List all of your existing/historical daily notes
List all comments on a gist
List the prompts in your gist-based prompts collection
List all of your GitHub Gists (excluding daily notes, prompts, and archived gists)
List all your starred gists
Refresh the server's cache of gists, to ensure it picks up any changes made by external clients.
Rename a file in a gist
Star a gist
Unarchive a gist
Unstar a gist
Update a GitHub Gist's description
Update the content of a file in a gist
Update the existing content of today's daily note, which is useful for tracking todos, tasks, scratch notes, etc.
Error handling lacks recovery guidance. Error responses do not consistently suggest what the LLM should do next (e.g., 'gist not found, try list_gists()' or retry guidance for rate limits). This forces agents to reason about recovery without explicit hints.
Some parameter descriptions are minimal (under 20 chars). 'The ID of the gist' is functional but lacks context, when should the LLM use this tool vs. list_gists()? Why would it need a gist ID before calling get_gist()?
edit_gist_file's find-and-replace semantic is sophisticated but the description could better explain when to use it vs. update_gist_file. The replace_all parameter and uniqueness requirement are clearly documented, but the description doesn't explain the use case (targeted small edits vs. full file replacement).
refresh_gists description ('Refresh the server's cache of gists') is vague. It doesn't explain WHY an agent would call this (e.g., 'after external edits' or 'to ensure consistency'), when it should be invoked, or what it returns.