Skip to main content
Glama
README.md
# JP's MCP Collection

JP's personal collection of [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) modules that provides a set of utility functions for Claude and other AI assistants. Built using the MCP SDK, this server exposes tools for system operations, Google services integration, and AI-powered text processing.

## Overview

MCPs are built using the MCP SDK and exposes a set of tools that can be used by AI assistants to interact with:

- System command execution
- File system operations
- Google Sheets integration
- Google Tasks management
- OpenAI chat completion and grammar checking
- Dynamic prompt loading from markdown files

## Features

### System Operations

- Command Execution: Run shell commands on the system with proper error handling and safety checks

### File System Operations

- Move Files to Trash: Safely delete files by moving them to the system trash
- Read Images: Read image files and return base64-encoded content with metadata

### Google Sheets Integration

- List Sheets: Get available sheets in the configured spreadsheet
- Read Sheet Content: Read data from specific ranges with pagination support
- Update Sheets: Modify cell values in spreadsheets
- Delete Rows: Remove specific rows from sheets
- Get Sheet Properties: Retrieve metadata about sheet structure
- Conditional Formatting: Add row-based conditional formatting rules

### Google Tasks Management

- Task Lists: Create, update, delete, and list task lists
- Tasks: Full CRUD operations for tasks including creation, updates, completion, and deletion
- Subtasks: Create hierarchical task structures
- Task Properties: Manage due dates, notes, and task status

### AI-Powered Text Processing

- Chat Completion: Send prompts to OpenAI's GPT models with customizable parameters
- Grammar Checking: Improve text grammar and clarity using AI

### Dynamic Prompt Management

- Automatic Prompt Loading: Loads prompts from markdown files at server startup
- Flexible Configuration: Configure prompt directory via environment variables
- Smart Naming: Auto-generate prompt names from filenames when not specified in frontmatter
- Frontmatter Support: Parse markdown frontmatter for prompt metadata

## Usage

The server runs using Deno and can be started in development mode:

```bash
# Run in development mode
npm run dev

# Run with the MCP inspector for debugging
npm run monitor

# Format code
npm run format
```

## Project Organization

### Directory Structure

```
jp-mcps/
├── package.json        # Project configuration and dependencies
├── README.md           # Documentation
├── .env.example        # Environment variables template
├── prompts/            # Default directory for dynamic prompts
└── src/                # Source code
    ├── modules/        # Modular MCP tool implementations
    │   ├── command/    # System command execution
    │   │   ├── functions/
    │   │   │   ├── run-command.ts
    │   │   │   └── index.ts
    │   │   ├── registerCommand.ts
    │   │   └── index.ts
    │   ├── dynamic-prompts/ # Dynamic prompt loading
    │   │   ├── functions/
    │   │   │   ├── load-prompts.ts
    │   │   │   └── index.ts
    │   │   ├── utils/
    │   │   │   ├── to-snake-case.ts
    │   │   │   └── index.ts
    │   │   ├── registerDynamicPrompts.ts
    │   │   └── index.ts
    │   ├── filesystem/ # File system operations
    │   │   ├── functions/
    │   │   │   ├── move-file-to-trash.ts
    │   │   │   ├── read-image.ts
    │   │   │   └── index.ts
    │   │   ├── registerFilesystem.ts
    │   │   └── index.ts
    │   ├── hello/      # Reference implementation module
    │   ├── openai/     # OpenAI API integration
    │   │   ├── functions/
    │   │   │   ├── chat-completion.ts
    │   │   │   ├── check-grammar.ts
    │   │   │   └── index.ts
    │   │   ├── registerOpenAI.ts
    │   │   └── index.ts
    │   ├── sheets/     # Google Sheets API integration
    │   │   ├── functions/
    │   │   │   ├── list-sheets.ts
    │   │   │   ├── list-sheet-content.ts
    │   │   │   ├── update-sheet.ts
    │   │   │   ├── delete-row.ts
    │   │   │   ├── get-sheet-properties.ts
    │   │   │   ├── add-row-conditional-formatting.ts
    │   │   │   └── index.ts
    │   │   ├── registerGoogleSheets.ts
    │   │   ├── utils.ts
    │   │   └── index.ts
    │   └── tasks/      # Google Tasks API integration
    │       ├── functions/
    │       │   ├── list-task-lists.ts
    │       │   ├── create-task-list.ts
    │       │   ├── update-task-list.ts
    │       │   ├── delete-task-list.ts
    │       │   ├── list-tasks.ts
    │       │   ├── create-task.ts
    │       │   ├── update-task.ts
    │       │   ├── complete-task.ts
    │       │   ├── delete-task.ts
    │       │   ├── create-subtask.ts
    │       │   └── index.ts
    │       ├── registerGoogleTasks.ts
    │       ├── client.ts
    │       └── index.ts
    └── index.ts        # Main entry point
```

### Code Organization

The JP MCPs project follows a modular architecture designed for maintainability and extensibility:

1. Main Entry Point: `src/index.ts` initializes the MCP server and registers all available tools.

2. Modular Functions: Each capability is encapsulated in its own module within the `modules` directory with standardized patterns:
   - Each module has a `functions/` directory containing individual function implementations
   - Functions are named in kebab-case for consistency
   - Each function file includes its Zod input schema alongside the implementation
   - Modules export their functions and corresponding schema definitions for type safety
   - Each function follows a consistent error handling pattern

3. MCP Tool Registration: Tools are registered in module-specific register files using the `server.tool()` method which takes:
   - A tool name (used by Claude to invoke the function)
   - A schema definition (using Zod for runtime type validation)
   - An async handler function implementing the tool's logic

4. Response Formatting: Each function formats its responses consistently as an object with `content` property containing text output.

5. Error Handling: Comprehensive error handling with a TypeScript-safe approach using a utility function `getErrorMessage()` that properly handles both Error objects and unknown error types.

### Design Patterns

JP MCPs employs several key design patterns:

- Facade Pattern: Each module presents a simplified interface to complex subsystems (APIs, filesystem, etc.)
- Function-based Organization: Clean separation of concerns with focused functions for each operation
- Schema Validation: All inputs are validated using Zod schemas before processing
- Consistent Error Handling: Try/catch blocks with standardized error responses
- Type Safety: Heavy use of TypeScript and `zod.infer` for type definitions

## Dependencies

- `@modelcontextprotocol/sdk`: Core MCP SDK for building MCP servers
- `@googleapis/sheets`: Google Sheets API client
- `@googleapis/tasks`: Google Tasks API client
- `google-auth-library`: Authentication for Google services
- `gray-matter`: Markdown frontmatter parsing for dynamic prompts
- `openai`: OpenAI API client for chat completion and text processing
- `execa`: Process execution for running system commands
- `trash`: Safe file deletion by moving to system trash
- `zod`: Schema validation and type safety

## Environment Variables

The following environment variables need to be configured:

- `OPENAI_API_KEY`: Your OpenAI API key for chat completion and grammar checking
- `GOOGLE_CLIENT_ID`: Google OAuth client ID for Tasks API
- `GOOGLE_CLIENT_SECRET`: Google OAuth client secret for Tasks API
- `GOOGLE_REDIRECT_URI`: Google OAuth redirect URI for Tasks API
- `GOOGLE_REFRESH_TOKEN`: Google OAuth refresh token for Tasks API
- `PROMPTS_DIRECTORY`: Directory path containing markdown prompt files (defaults to "./prompts")

### Dynamic Prompts Setup

Create markdown files in your prompts directory with frontmatter:

```markdown
---
name: my_prompt
description: Description of what this prompt does
---

Your prompt content here...
```

Naming Rules:
- If `name` is provided in frontmatter, it will be used as-is
- If `name` is missing, the filename (without .md) will be converted to snake_case
- If `description` is missing, it defaults to an empty string

Example:
- File: `Code Review.md` → Prompt name: `code_review`
- File: `generate-tests.md` → Prompt name: `generate_tests`

## Integration

JP MCPs is designed to be used as a tool provider for AI assistants like Claude through the Model Context Protocol, which allows the assistant to invoke functions defined in this server.

## Security Notes

- Command execution includes safety checks for potentially dangerous operations
- File operations are limited to safe actions (move to trash, read images)
- All API calls are properly authenticated and use official client libraries
- Input validation is performed using Zod schemas before any operations
- Dynamic prompts are loaded from configurable directories to avoid hardcoded paths