parchmark-mcp
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., "@parchmark-mcplist all my notes"
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.
parchmark-mcp
MCP server for managing ParchMark notes via Claude Code/Desktop.
Installation
# Run directly
uvx --from git+https://github.com/TejGandham/parchmark-mcp parchmark-mcp
# Or install
pip install git+https://github.com/TejGandham/parchmark-mcpRelated MCP server: MCP Notes Server
Upgrading
Caveat: the
uvx --from git+…install above is unpinned, butuvxcaches the resolved git commit and reuses it — it does not re-pull new commits on its own. New releases will not appear until you bust the cache:# Re-fetch the default-branch HEAD and rebuild the cached environment uvx --refresh --from git+https://github.com/TejGandham/parchmark-mcp parchmark-mcp # …or just clear this package's cache so the next launch re-resolves uv cache clean parchmark-mcpThen restart your MCP client (Claude Code/Desktop, opencode) so it relaunches the server — a running client keeps the old process until restarted. See docs/INSTALL.md for details and the
pip/uv pipequivalents.
Configuration
Environment Variables
Variable | Description | Example |
| API base URL |
|
| Your username |
|
| Your password |
|
Claude Code Setup
claude mcp add parchmark -s user \
-e "PARCHMARK_URL=https://your-instance/api" \
-e "PARCHMARK_USERNAME=your-user" \
-e "PARCHMARK_PASSWORD=your-pass" \
-- uvx --from git+https://github.com/TejGandham/parchmark-mcp parchmark-mcpOr manually add to .mcp.json:
{
"mcpServers": {
"parchmark": {
"command": "uvx",
"args": ["--from", "git+https://github.com/TejGandham/parchmark-mcp", "parchmark-mcp"],
"env": {
"PARCHMARK_URL": "https://parchmark.example.com/api",
"PARCHMARK_USERNAME": "your-username",
"PARCHMARK_PASSWORD": "your-password"
}
}
}
}Tools
Tool | Parameters | Description |
| None | List all notes (metadata only) |
|
| Get a specific note with full content |
|
| Create a new note from markdown |
|
| Update an existing note |
|
| Delete a note |
Architecture
parchmark-mcp/
├── src/parchmark_mcp/
│ ├── __init__.py # Package version
│ ├── server.py # FastMCP server & tools
│ ├── client.py # ParchMark API client
│ └── models.py # Pydantic models
├── tests/
│ ├── test_models.py # Model tests
│ ├── test_client.py # Client tests (mocked)
│ └── test_server.py # Server tests (mocked)
└── pyproject.toml # Package configDevelopment
# Clone and install
git clone https://github.com/TejGandham/parchmark-mcp
cd parchmark-mcp
uv sync --all-extras
# Run tests
uv run pytest tests/ -v
# Lint & format
uv run ruff check src/ tests/
uv run ruff format src/ tests/
# Type check
uv run pyright src/ tests/Quality Gates
Pre-commit hooks enforce:
ruff- Linting with autofixruff-format- Code formattingpyright --strict- Type checking
Tech Stack
FastMCP - Python MCP framework
httpx - Async HTTP client
Pydantic - Data validation & models
pyright - Static type checking (strict mode)
ruff - Linting & formatting
pytest - Testing with async support
License
MIT
Available Tools
5 toolscreate_noteA
Create a new note with markdown content.
The note title is automatically extracted from the first H1 heading.
Args: content: Markdown content for the note (should start with # Title)
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| content | Yes | |
| createdAt | Yes | |
| updatedAt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral trait beyond the schema: it automatically derives the title from the first H1 heading. It also clarifies that content is in markdown format. With no annotations available, this adds necessary transparency about how the tool processes input, though it doesn't cover edge cases like missing H1 or output behavior.
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 only three sentences, front-loading the core purpose and then providing the necessary detail about title extraction. It avoids redundancy and stays tightly focused on the essential information for correct use.
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 simple one-parameter create tool, the description covers the primary purpose and the most critical behavior (title extraction). The presence of an output schema covers return values. However, it doesn't mention what happens if the content lacks an H1 heading or other edge cases, which could be relevant for the agent.
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 provides only a string property named 'content' with no description (0% coverage). The description explains that content is markdown and should start with '# Title', adding essential semantic meaning that the schema lacks. This fully compensates for the schema's lack of parameter documentation.
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 'Create a new note with markdown content,' giving a specific verb, resource, and content format. This distinguishes it from sibling tools like list_notes, get_note, update_note, and delete_note.
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 provides an implicit usage context (when creating a new note) and adds an important operational guideline: the title is automatically extracted from the first H1 heading, so content should start with '# Title'. While it doesn't explicitly name alternative tools, the guidance prevents misuse and clarifies the expected content structure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_noteB
Delete a note by ID.
Args: note_id: The unique identifier of the note to delete
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It states 'Delete a note by ID' but does not mention that deletion is permanent, potential side effects, error conditions (e.g., invalid ID), or any required permissions. This is a meaningful gap for a destructive operation.
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 extremely concise, with one clear action sentence and a parameter definition. Every word earns its place, and the structure is front-loaded. No redundant information.
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 simple single-parameter delete tool, the description covers the core operation and parameter adequately. The presence of an output schema reduces the need to describe return values. However, the lack of behavioral context (e.g., permanence, error handling) prevents a perfect score, but given the simplicity of the tool, this is acceptable.
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 input schema only lists note_id as a required string. The description adds 'The unique identifier of the note to delete', which clarifies the parameter's role and uniqueness. However, this is minimal and does not compensate fully for the 0% schema description coverage; the semantic addition is limited.
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 opens with 'Delete a note by ID', which is a specific verb ('Delete') and resource ('note'), and uses the identifier parameter. This clearly distinguishes it from sibling tools like list_notes, get_note, create_note, and update_note.
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 provides no guidance on when to use this tool versus alternatives. It does not mention exclusions, prerequisites, or context for use. The action is obviously for deletion, but no explicit usage guidance is offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_noteA
Get a specific note by ID with full content.
Args: note_id: The unique identifier of the note (e.g., "note-1234567890")
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| content | Yes | |
| createdAt | Yes | |
| updatedAt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only mentions 'full content' and gives an example ID, but does not disclose error behavior, authentication requirements, or whether the note might be trashed or inaccessible. Minimal behavioral context.
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 short and front-loaded with the purpose. The Args block is somewhat redundant with the schema, but it does not waste words and every component contributes to clarity.
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?
The tool is simple with one parameter and an output schema exists, so return format is covered. However, the description lacks any note about behavior on missing IDs, access scopes, or pagination, leaving some contextual gaps for an agent to handle.
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?
Although the schema only defines note_id as a string, the description adds an Args block defining it as 'the unique identifier of the note' and provides an example. This adds meaning beyond the bare schema, even though schema coverage is 0% by itself.
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 'Get a specific note by ID with full content', with a specific verb and resource. It distinguishes from sibling tools like list_notes (which implies listing multiple notes) by emphasizing 'specific note by ID'.
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?
Usage is implied: use when you have a note ID and need full content. However, it does not explicitly mention when not to use it or directly reference alternatives like list_notes for browsing notes, leaving differentiation to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesA
List all notes for the authenticated user.
Returns note metadata (id, title, timestamps) without content. Use get_note to retrieve full content for a specific note.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| notes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that only metadata is returned (no content) and that it is scoped to the authenticated user. It does not mention pagination or ordering, but for a simple list operation this is reasonably transparent.
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 concise sentences immediately state the action and the key limitation (no content), with a forward pointer to the alternative. No wasted words.
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 zero-parameter list tool with an output schema, the description is complete: it explains what is returned, the scope, and directs to get_note for full content. Nothing critical is missing.
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 tool has zero parameters, so the schema fully covers parameter semantics (100% coverage). The baseline for 0 parameters is 4; the description adds no parameter info because none is needed.
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 lists all notes for the authenticated user, with a specific verb ('List') and resource ('notes'). It distinguishes itself from sibling get_note by explicitly noting it returns metadata without content.
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 explicitly instructs to use get_note for full content, providing an alternative and clarifying when this tool is appropriate (listing metadata). This meets the 'explicit when/when-not/alternatives' criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_noteA
Update an existing note's content.
The note title is automatically re-extracted from the first H1 heading.
Args: note_id: The unique identifier of the note to update content: New markdown content for the note
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| note_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | Yes | |
| content | Yes | |
| createdAt | Yes | |
| updatedAt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It does disclose a non-obvious behavior: 'The note title is automatically re-extracted from the first H1 heading.' This adds value beyond the basic update action. However, it does not mention potential side effects, error behaviors, or permission requirements, leaving some gaps.
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 compact and well-structured: a one-sentence purpose, a notable behavioral note, and a clear Args list. Every line earns its place, and the essential information is front-loaded. No redundancy or fluff.
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?
The description covers the core purpose, key behavioral nuance, and parameter semantics. Since an output schema exists, the description need not explain return values. It could benefit from addressing edge cases like invalid note_id or whether content replaces or merges, but overall it provides sufficient context for a simple update operation.
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 input schema has zero descriptions for its parameters, so the description compensates by providing explicit explanations: 'note_id: The unique identifier of the note to update' and 'content: New markdown content for the note.' This clarifies the meaning and role of each parameter effectively, though it could add more detail about content format or constraints.
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 'Update an existing note's content,' which specifies the verb (update), resource (note), and scope (content). This distinguishes it from sibling tools like create, delete, list, and get, making the purpose unambiguous.
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 phrase 'existing note' implies this tool is for notes that already exist, suggesting a contrast with create_note. However, there is no explicit guidance on when to use this versus alternatives, nor any exclusion criteria. The usage context is clear from the name and first sentence but not elaborated.
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.
5 tool updates
v0.1.0- First observed
create_note - First observed
delete_note - First observed
get_note - First observed
list_notes - First observed
update_note
TDQS
Scored across 5 tools
Each tool has a completely distinct role: listing metadata, retrieving full content, creating, updating, and deleting. No overlap or ambiguity exists.
All tool names follow a strict verb_noun pattern (list_notes, get_note, create_note, update_note, delete_note), making the API highly predictable.
With exactly 5 tools covering a notes CRUD lifecycle, the server is well-scoped without redundancy or excess.
The full CRUD cycle is present: list/get for reading, create, update, and delete. No essential operation for a notes domain is missing.
Maintenance
Related MCP Connectors
- TaprootOAuthcom.taproothq
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
An MCP server that used to create notes
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Related MCP Servers
- FlicenseAqualityBmaintenanceA local MCP server for managing Markdown notes, enabling create, list, read, search, summarize, and delete operations through natural language.61-
- AlicenseNot gradedqualityDmaintenanceA beginner-friendly MCP server for managing personal notes. Enables Claude to create, list, read, search, update, and delete notes saved as Markdown files.MIT
- FlicenseNot gradedqualityDmaintenanceA simple notes MCP server that enables creating, listing, and summarizing text notes via resources, tools, and prompts.-
- AlicenseAqualityBmaintenanceAn MCP server that stores notes as Markdown files on your machine, enabling you to save, search, and manage notes through natural language with Claude Code or Claude Desktop.5MIT