Skip to main content
Glama
chambtai-sys

CatMCP

by chambtai-sys

CatMCP

       /\_/\
      ( o.o )   [ BETA ]
       > ^ <
     _ /   \ _
    ( )     ( )
    ` `     ` `
     \__/\_/

CatMCP is a lightweight, playful, and fully standard-compliant Model Context Protocol (MCP) server that serves a curated collection of hilarious cat jokes to LLM clients (like Claude Desktop, Cursor, and more). Whether you need tech puns, classic question-and-answers, silly scenarios, or workplace meow-ments, CatMCP has you covered!


๐ŸŒŸ Features

  • Purr-fect Joke Database: Hand-crafted collection of 24 cat jokes categorized by themes.

  • Categorized Selections: Easily request jokes filtered by category (tech, classic, puns, silly, work).

  • Flexible Searching: Full-text case-insensitive search across the entire joke database.

  • Rich Resources:

    • jokes://all: Read the complete dataset in JSON format.

    • jokes://categories: Read a summary of all categories and their joke counts.

    • jokes://random: Fetch a dynamic random joke in raw text format.

  • Creative Prompts: Integrate interactive prompt templates like tell_cat_joke to turn LLMs into cat-loving stand-up comedians.

  • Robustly Tested: Built using fastmcp with comprehensive unit tests for high reliability.


Related MCP server: Microsoft Copilot Studio MCP

๐Ÿš€ Quick Start

Prerequisites

  • Python: >=3.12

  • uv (Recommended package manager): Install uv

Installation

Clone the repository and install dependencies using uv:

# Clone the repository
git clone https://github.com/Perseu/catmcp.git
cd catmcp

# Install dependencies and create a virtual environment
uv sync

Running the Server

You can start the MCP server using standard IO (stdio) transport:

uv run python main.py

๐Ÿ› ๏ธ MCP Capabilities

1. Tools

  • get_random_joke(category: Optional[str]): Retrieve a random cat joke. You can filter by category: tech, classic, puns, silly, or work.

  • list_categories(): Get a sorted list of all available joke categories.

  • search_jokes(keyword: str): Case-insensitive text search across joke setups, punchlines, and categories.

2. Resources

  • jokes://all: Serves the entire joke database as a static JSON resource.

  • jokes://categories: Serves the category distribution and count summary as a JSON resource.

  • jokes://random: Serves a dynamic random cat joke in plain text format.

3. Prompts

  • tell_cat_joke(category: Optional[str], tone: Optional[str]): Generates a standard instruction set directing the AI client to perform the joke under a specified persona (e.g. CatComedian) and tone (e.g. sarcastic, enthusiastic, dry).


โš™๏ธ Host Configuration

To integrate CatMCP with your favorite LLM client, add the server to your configuration file.

Claude Desktop

Add this to your claude_desktop_config.json:

{
  "mcpServers": {
    "catmcp": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/catmcp",
        "run",
        "python",
        "main.py"
      ]
    }
  }
}

Cursor

  1. Go to Settings > Features > MCP.

  2. Click + Add New MCP Server.

  3. Fill in the fields:

    • Name: CatMCP

    • Type: command

    • Command: uv --directory "/absolute/path/to/catmcp" run python main.py


๐Ÿงช Testing

CatMCP uses pytest for testing. You can run all 11 unit tests to verify server tools, resources, and prompts:

uv run pytest

๐Ÿ“„ License

This project is licensed under the MIT License. See the LICENSE file for details.


Created with ๐Ÿพ by Perseu.

Available Tools

3 tools
get_random_jokeB

Retrieve a random cat joke.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoOptional category to filter jokes (e.g. 'tech', 'classic', 'puns', 'silly', 'work').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description must carry the full burden. It only states 'Retrieve a random cat joke' without disclosing the effect of the optional 'category' parameter, which is a key behavioral trait. It also does not mention any side effects, permissions, or rate limits, though as a read-only operation this may be less critical. The description adds no context beyond the schema.

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 a single, front-loaded sentence with zero filler. It states exactly what the tool does in the fewest possible words.

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?

For a simple read tool with an output schema and full parameter documentation, the description is minimally sufficient. However, it does not mention the optional category filter or differentiate from sibling tools, leaving some context to be inferred. Given the low complexity, a score of 3 is appropriate.

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?

Schema description coverage is 100% for the single optional 'category' parameter, so the baseline is 3. The description adds no additional meaning beyond what the schema already provides, but since the schema is fully descriptive, the agent has enough information to use the parameter correctly.

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 uses a specific verb ('Retrieve') and a clear resource ('a random cat joke'), which immediately distinguishes this tool from siblings like 'list_categories' and 'search_jokes'. The purpose is unambiguous and concise.

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 compared to the siblings. It does not state that this is for retrieving a single random joke, whereas search_jokes would be for searching with criteria, or list_categories for browsing categories. No alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_categoriesA

Get a list of all available cat joke categories.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. The verb 'Get' clearly indicates a read-only operation, and 'all available' signals the completeness of the result. No side effects or destructive behavior are implied, and the lack of parameters further simplifies expectations.

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 a single sentence that is direct and front-loaded, with no wasted words. It efficiently conveys the operation and scope.

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?

Given the simple nature of the tool, no parameters, and an available output schema, the description is sufficient. It fully explains what the tool does and what the user can expect, making the overall context complete.

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, and the description correctly implies that no input is needed. With no parameters, the schema already fully covers this aspect, and the description adds appropriate clarity by stating it lists all categories without filters.

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 uses a specific verb ('Get') and resource ('all available cat joke categories'), making the tool's purpose unambiguous. It clearly distinguishes itself from sibling tools by focusing on category listing rather than random jokes or searching.

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 implies the tool should be used when a complete list of categories is needed, and the scope 'all available' sets clear context. It does not explicitly mention when not to use it or reference siblings, but the purpose is clear enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_jokesA

Search jokes for a specific keyword in the setup or punchline.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordYesCase-insensitive search keyword.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of implying the tool's behavior. 'Search' clearly indicates a read-only, non-mutating operation. It adds the specific scope of searching setup or punchline, which is useful behavioral context. However, it doesn't explicitly state that no modifications occur or how results are returned, but the output schema covers return structure.

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 a single, focused sentence that is front-loaded with the action and object. It contains no fluff or repetition, every word adds value.

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 tool with a full output schema, the description is complete enough. It explains the search scope and the schema covers the parameter. It doesn't specify behaviors like no results or multiple matches, but these are implied by a search operation and the output schema likely handles them. Minor gap: no explicit guidance on when not to use it versus sibling tools.

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 schema describes 'keyword' as a 'Case-insensitive search keyword,' which is adequate, but the tool description adds crucial meaning: the keyword is matched in the setup or punchline. This is not stated in the schema, so the description enriches parameter understanding.

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's function: 'Search jokes for a specific keyword in the setup or punchline.' It uses a specific verb (search) and resource (jokes), and even specifies the search scope (setup or punchline), distinguishing it from sibling tools like get_random_joke and list_categories.

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 clear context for when to use the tool: when you need to find jokes containing a specific keyword. It doesn't explicitly mention alternatives or exclusions, but the purpose is self-evident given sibling tools have different functions (random joke, categories).

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. 3 tool updatesv0.1.0
    • First observedget_random_joke
    • First observedlist_categories
    • First observedsearch_jokes

TDQS

A4.2/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: retrieving a random joke, listing categories, and searching jokes by keyword. There is no overlap or ambiguity between them.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: get_random_joke, list_categories, search_jokes. This makes the API predictable and easy to navigate.

Tool Count5/5

With only 3 tools, the server is tightly scoped and each tool earns its place. The count is appropriate for a focused cat joke service.

Completeness5/5

The tool set covers the core needs of a joke API: random access, category browsing, and keyword search. There are no obvious missing operations for the stated purpose.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP server that delivers various joke types (Chuck Norris, Dad jokes, etc.) to Microsoft Copilot Studio and GitHub Copilot, allowing users to request specific joke categories through natural language.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server that enables integration of joke delivery capabilities into Microsoft Copilot Studio and GitHub Copilot, allowing users to request and receive various types of jokes through natural language.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that provides jokes on demand, allowing users to request different types of jokes (Chuck Norris, Dad jokes, etc.) through natural language in both GitHub Copilot and Microsoft Copilot Studio.
    MIT