Skip to main content
Glama
TejGandham

parchmark-mcp

by TejGandham
README.md
# parchmark-mcp

MCP server for managing ParchMark notes via Claude Code/Desktop.

## Installation

```bash
# Run directly
uvx --from git+https://github.com/TejGandham/parchmark-mcp parchmark-mcp

# Or install
pip install git+https://github.com/TejGandham/parchmark-mcp
```

## 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:
>
> ```bash
> # 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](docs/INSTALL.md#upgrading)
> 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

```bash
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`:

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

```bash
# 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

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