Skip to main content
Glama
TejGandham

parchmark-mcp

by TejGandham

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-mcp

Related MCP server: MCP Notes Server

Upgrading

Caveat: the uvx --from git+… install above is unpinned, but uvx caches 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-mcp

Then 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 pip equivalents.

Configuration

Environment Variables

Variable

Description

Example

PARCHMARK_URL

API base URL

https://parchmark.example.com/api

PARCHMARK_USERNAME

Your username

myuser

PARCHMARK_PASSWORD

Your password

mypassword

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-mcp

Or 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

list_notes

None

List all notes (metadata only)

get_note

note_id

Get a specific note with full content

create_note

content

Create a new note from markdown

update_note

note_id, content

Update an existing note

delete_note

note_id

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 config

Development

# 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 autofix

  • ruff-format - Code formatting

  • pyright --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 tools
create_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)

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
titleYes
contentYes
createdAtYes
updatedAtYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
successYes

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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")

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
titleYes
contentYes
createdAtYes
updatedAtYes

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
notesYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes
note_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
titleYes
contentYes
createdAtYes
updatedAtYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

  1. 5 tool updatesv0.1.0
    • First observedcreate_note
    • First observeddelete_note
    • First observedget_note
    • First observedlist_notes
    • First observedupdate_note

TDQS

A4.2/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a completely distinct role: listing metadata, retrieving full content, creating, updating, and deleting. No overlap or ambiguity exists.

Naming Consistency5/5

All tool names follow a strict verb_noun pattern (list_notes, get_note, create_note, update_note, delete_note), making the API highly predictable.

Tool Count5/5

With exactly 5 tools covering a notes CRUD lifecycle, the server is well-scoped without redundancy or excess.

Completeness5/5

The full CRUD cycle is present: list/get for reading, create, update, and delete. No essential operation for a notes domain is missing.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A beginner-friendly MCP server for managing personal notes. Enables Claude to create, list, read, search, update, and delete notes saved as Markdown files.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    An 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.
    5
    MIT