Skip to main content
Glama
SAS-AII

mcp-server

by SAS-AII

AI Makerspace: MCP Session Repo for Session 13

This project is a demonstration of the MCP (Model Context Protocol) server, which utilizes the Tavily API for web search capabilities. The server is designed to run in a standard input/output (stdio) transport mode.

Related MCP server: metasearch-mcp

Project Overview

The MCP server is set up to handle web search queries using the Tavily API. It is built with the following key components:

  • TavilyClient: A client for interacting with the Tavily API to perform web searches.

Prerequisites

  • Python 3.13 or higher

  • A valid Tavily API key

โš ๏ธNOTE FOR WINDOWS:โš ๏ธ

You'll need to install this on the Windows side of your OS.

This will require getting two CLI tool for Powershell, which you can do as follows:

  • winget install astral-sh.uv

  • winget install --id Git.Git -e --source winget

After you have those CLI tools, please open Cursor into Windows.

Then, you can clone the repository using the following command in your Cursor terminal:

git clone https://AI-Maker-Space/AIE7-MCP-Session.git

After that, you can follow from Step 2. below!

Installation

  1. Clone the repository:

    git clone <repository-url>
    cd <repository-directory>
  2. Configure environment variables: Copy the .env.sample to .env and add your Tavily API key:

    TAVILY_API_KEY=your_api_key_here
  3. ๐Ÿ—๏ธ Add a new tool to your MCP Server ๐Ÿ—๏ธ

Create a new tool in the server.py file, that's it!

Running the MCP Server

To start the MCP server, you will need to add the following to your MCP Profile in Cursor:

NOTE: To get to your MCP config. you can use the Command Pallete (CMD/CTRL+SHIFT+P) and select "View: Open MCP Settings" and replace the contents with the JSON blob below.

{
    "mcpServers":  {
        "mcp-server": {
            "command" : "uv",
            "args" : ["--directory", "/PATH/TO/REPOSITORY", "run", "server.py"]
        }
    }
}

The server will start and listen for commands via standard input/output.

Usage

The server provides a web_search tool that can be used to search the web for information about a given query. This is achieved by calling the web_search function with the desired query string.

Activities:

There are a few activities for this assignment!

๐Ÿ—๏ธ Activity #1: โœ…

  • Built an MCP tool for the Chess.com API to fetch player details and ratings.

  • Implemented as chess_player_stats in server.py and routed via chess_router.py.

๐Ÿ—๏ธ Activity #2: LangGraph + MCP Chess App โœ…

  • Implemented a LangGraph ReAct agent that connects to the local MCP server and automatically selects chess tools for natural-language queries.

  • Requirements:

    • Install Stockfish and ensure stockfish is in your PATH (or set STOCKFISH_PATH in .env).

    • Set .env variables: OPENAI_API_KEY, CHESS_USERNAME. Optional: TAVILY_API_KEY, STOCKFISH_PATH.

  • Run:

    uv run main.py

Available Tools

10 tools
chessA

Unified Chess tool (prefer the specific chess_* tools instead).

Supported actions and params:

  • recent_matches: {"limit": int = 5}

  • last_match: {}

  • player_stats: {}

  • analyze_recent_game: {"game_index": int = 0, "movetime_ms": int = 500}

  • analyze_pgn: {"pgn_string": str, "movetime_ms": int = 500}

  • analyze_multiple_pgn: {"pgn_strings": str, "movetime_ms": int = 500}

Examples:

  • chess("recent_matches", {"limit": 3})

  • chess("player_stats")

  • chess("analyze_recent_game", {"game_index": 0, "movetime_ms": 700})

  • chess("analyze_pgn", {"pgn_string": "[Event ...] 1. e4 e5 ...", "movetime_ms": 500})

  • chess("analyze_multiple_pgn", {"pgn_strings": "PGN1 --- PGN2"})

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
paramsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are provided, so the description must fully disclose behavioral traits. It only lists action signatures and parameters, with no mention of side effects, authentication, rate limits, or error handling. This is insufficient for a tool with multiple sub-actions.

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 well-structured with a clear introduction, a list of actions with parameter objects, and examples. It is front-loaded with the preference note. Slightly verbose but each section earns its place.

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?

Given the tool's complexity (7 sub-actions) and the presence of an output schema, the description covers all necessary invocation details: action names, parameter formats, and a delimiter for multiple PGNs. It is sufficient for correct invocation, though it could mention the output schema briefly.

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 has 0% parameter description coverage, but the description compensates by detailing the expected params for each action (e.g., 'limit': int = 5) and providing examples. This adds significant meaning beyond the empty schema. Could be improved by explaining the output schema or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it is a 'Unified Chess tool' and lists the specific actions it supports, distinguishing it from the sibling chess_* tools. However, it is not a single verb+resource but a collection, which slightly reduces clarity.

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?

Explicitly says 'prefer the specific chess_* tools instead,' providing clear guidance on when to use this tool versus the alternatives. It also lists all supported actions, enabling the agent to decide when this unified tool is appropriate.

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

chess_analyze_game_idA

Analyze a Chess.com game by its game ID using Stockfish.

Parameters:

  • game_id: The Chess.com game ID (UUID or numeric) from the game's URL

  • movetime_ms: Time per move for engine analysis (default 500)

Example:

  • chess_analyze_game_id("141227700772", 300)

ParametersJSON Schema
NameRequiredDescriptionDefault
game_idYes
movetime_msNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/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 full burden. It discloses the engine used (Stockfish), default move time (500 ms), and the dependent parameter (game_id). It does not, however, specify output format or limits (e.g., max time, engine strength), but given minimal annotation burden, this is sufficient for a simple analysis tool.

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 concise with a sentence, parameter list, and example. The example is useful but uses inconsistent quoting (double quotes inside string). Minimal waste, though the parameter list could be integrated into prose for better flow.

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?

Given low complexity (2 params, no nested objects) and presence of an output schema, the description covers input sufficiently. It lacks details on output or edge cases (e.g., invalid game_id), but with an output schema present, return values are documented elsewhere. Adequate for the tool's scope.

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?

Schema coverage is 0%, so the description must compensate. It explains game_id as 'UUID or numeric from the game's URL' and movetime_ms as 'Time per move for engine analysis', adding context beyond the schema's basic types and defaults. An example is also provided. The semantic clarity over schema fields is high.

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 analyzes a Chess.com game by game ID using Stockfish, including a specific verb ('analyze'), resource ('Chess.com game by its game ID'), and method ('using Stockfish'). It distinguishes from siblings like chess_analyze_pgn and chess_analyze_recent_game by focusing on game IDs.

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 description provides no explicit guidance on when to use this tool versus siblings (e.g., chess_analyze_recent_game for recent games, chess_analyze_pgn for PGN data). The context is implied through the parameter focus on game_id, but exclusions or alternatives are absent.

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

chess_analyze_multiple_pgnA

Analyze multiple PGNs separated by '---', '###', or triple newlines.

Parameters:

  • pgn_strings: One or more PGNs separated by a supported delimiter

  • movetime_ms: Time per move for engine analysis (default 500)

Example:

  • chess_analyze_multiple_pgn("PGN1 --- PGN2", 300)

ParametersJSON Schema
NameRequiredDescriptionDefault
movetime_msNo
pgn_stringsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 must disclose behavioral traits. It reveals that engine analysis occurs per move and defaults to 500ms, but does not state whether the tool is read-only or destructive, rate limits, or any side effects. The example is helpful but limited.

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: one line of purpose, two lines of parameter details, and one example. Every sentence adds value with no redundancy or filler. Front-loaded structure is effective.

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?

Given the tool's moderate complexity (2 params, one required) and without annotations, the description covers the essential input semantics. An output schema exists but is not detailed; the description does not explain return format, though it should. Still, it is largely sufficient for an analysis tool.

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?

Schema description coverage is 0%, meaning the schema provides no parameter descriptions. The tool description adds significant meaning: it explains the pgn_strings format (supported delimiters) and clarifies movetime_ms as time per move with a default. This compensates well for the schema gap.

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 analyzes multiple PGNs separated by specific delimiters. It distinctly differentiates itself from sibling tools like chess_analyze_pgn, chess_analyze_game_id, and chess_analyze_recent_game by focusing on batch analysis of user-provided PGN strings.

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 description provides clear syntax for input format and includes a parameter example, but does not explicitly guide when to use this tool versus chess_analyze_pgn (single PGN) or other analysis tools. It implies usage for batch PGN analysis but lacks when-not-to-use guidance.

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

chess_analyze_pgnC

Analyze a single PGN string with Stockfish.

Parameters:

  • pgn_string: The PGN of the game to analyze

  • movetime_ms: Time per move for engine analysis (default 500)

Example:

  • chess_analyze_pgn("[Event ...] 1. e4 e5 ...", 300)

ParametersJSON Schema
NameRequiredDescriptionDefault
pgn_stringYes
movetime_msNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations provided, so the description carries full burden. It states analysis with Stockfish and mentions a default time per move (500 ms), but does not disclose what 'analyze' meansโ€”e.g., whether it returns evaluations, best moves, or a full analysis report. The return format or side effects are not described. The tool modifies no state, but this is implied rather than stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is reasonably concise with a parameter list and example. However, it repeats structural elements (parameter list, example) common to many tools. The example uses placeholders ('...'), which could be more specific. The description could be more compact without losing value.

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?

Given the tool has an output schema (likely describing analysis results), the description does not need to detail return values. However, with no annotations and two parameters (one undocumented in schema), the description leaves some gaps: it doesn't explain what constitutes a valid PGN, error handling, or whether the analysis is synchronous. The example helps but is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It lists parameters: pgn_string (PGN of the game to analyze) and movetime_ms (time per move, default 500). However, it does not specify the format expected for pgn_string (e.g., must be a full PGN with headers? move text only?), nor the valid range or semantics of movetime_ms (e.g., is it milliseconds? does the engine respect it?). The example is helpful but not enough to fully cover undocumented parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Analyze a single PGN string with Stockfish', which pairs a specific verb ('analyze') with a resource ('single PGN string'). It distinguishes from siblings like 'chess_analyze_game_id' (analysis from a game ID) and 'chess_analyze_multiple_pgn' (analysis of multiple PGNs). The purpose is clear and specific.

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 description implies usage through the example and parameter defaults, but does not explicitly state when to use this tool versus alternatives. For example, it doesn't clarify that this is for a single PGN string, while 'chess_analyze_multiple_pgn' is for multiple. No explicit guidance on excluding other tools.

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

chess_analyze_recent_gameC

Run engine analysis on one of your recent games (0 = latest).

Parameters:

  • game_index: Which recent game to analyze (0 = latest)

  • movetime_ms: Time per move for engine analysis in milliseconds (default 500)

Example:

  • chess_analyze_recent_game(0, 700)

ParametersJSON Schema
NameRequiredDescriptionDefault
game_indexNo
movetime_msNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior1/5

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

No annotations are provided, so the description must convey behavioral traits. It only says 'Run engine analysis' with no information about side effects (e.g., mutating state), rate limits, authorization needs, or output nature (return format, what analysis includes). This is a significant gap for a tool that performs computation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short (one sentence plus parameter list and example) but somewhat redundant: the example echoes the parameter listing. It is not formatted as a structured specification. Some critical information is omitted (behavior, output). Conciseness is achieved at the cost of clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists, the description does not state what the analysis returns (e.g., move evaluations, best lines, scores). For a tool that 'runs analysis', the agent needs to know the type and granularity of output. The description leaves the agent to infer from the output schema, but context about the analysis purpose (e.g., depth, limited to recent games) is lacking.

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 0%, but the description adds meaning beyond the schema by explaining game_index (which recent game, default 0 is latest) and movetime_ms (time in milliseconds, default 500). The example reinforces usage. However, the explanations are brief and lack format constraints (e.g., range for movetime_ms).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Run engine analysis' and resource 'recent games', with a specific indexing scheme (0 = latest). It distinguishes from siblings like chess_analyze_pgn (PGN input) and chess_analyze_game_id (arbitrary game ID) but does not explicitly state that this tool is limited to the user's own recent games.

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?

No when-to-use or when-not-to-use guidance is given. The description does not compare with sibling tools like chess_analyze_game_id or chess_analyze_pgn, nor does it suggest prerequisites (e.g., must have played recent games). The example only shows parameter values, not usage context.

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

chess_last_matchA

Show details about your most recent finished game.

Example:

  • chess_last_match()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/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. It states the purpose but discloses no behavioral traits such as required authentication, side effects, caching, or data recency. For a read-only tool, the lack of transparency is moderate; the description does not confirm safety or scope beyond the basic function.

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: two short sentences, including a functional example. Every word adds value, with no redundancy or fluff. It is front-loaded with the core purpose.

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 zero-parameter tool with an output schema, the description is mostly adequate. However, it does not explain what 'details' encompass or how 'most recent finished game' is determined (e.g., by date, by time control). The sibling tools hint at potential overlap, and the description lacks contextual cues to differentiate further. The example helps but does not fully close the gap.

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 schema coverage is 100% (trivially). The description adds value by showing an example call with empty parentheses, confirming the parameterless nature. No further clarification is needed, as the schema already exhaustively defines the input.

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 action ('Show details') and the specific resource ('your most recent finished game'). It distinguishes from siblings like 'chess_recent_matches' (which likely lists multiple matches) and 'chess_analyze_recent_game' (which implies analysis, not just details). The example reinforces the zero-parameter call.

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?

No explicit guidance on when to use this tool versus alternatives like 'chess_recent_matches' or 'chess_analyze_recent_game'. The description does not mention prerequisites, limitations, or conditions for use. It provides merely an example, which hints at usage but lacks comparative context.

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

chess_player_statsC

Get your Chess.com profile and ratings summary.

Example:

  • chess_player_stats()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior1/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It fails to mention authentication requirements, data freshness, error handling, or any side effects. The description is a single sentence that does not reveal any behavioral traits beyond the basic operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short (one sentence plus an example), which is concise but not well-structured. It lacks any breakdown of purpose, usage, or behavior. It earns its place in terms of brevity, but the lack of structure makes it less helpful for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters but an output schema exists, the description should clarify the user context (e.g., authenticated user or requires a username from the environment). It does not mention any prerequisites or the scope of the profile. The description is incomplete for an agent to reliably use the tool.

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 schema description coverage is trivially 100%. The description adds minimal meaning beyond the schema by specifying 'profile and ratings summary,' which is slightly more descriptive than just 'stats.' The baseline for 0 parameters is 4, and the description does not detract from that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get your Chess.com profile and ratings summary,' which specifies a verb and resource. The word 'your' implies it returns the authenticated user's profile, differentiating it from sibling tools like chess_recent_matches that require a username parameter. However, it does not explicitly state whose profile is fetched, leaving some ambiguity.

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?

No guidance is provided on when to use this tool versus alternatives. The description does not mention any context, prerequisites, or exclusions. Sibling tools like chess_recent_matches and chess_analyze_* are not referenced, leaving the agent to infer appropriate usage without support.

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

chess_recent_matchesB

List your most recent games.

Parameters:

  • limit: Number of games to list (default 5)

Example:

  • chess_recent_matches(3)

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/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 of behavioral disclosure. It only states 'List your most recent games' and provides a parameter example, but omits details such as authentication requirements, pagination, error handling, or what happens when no games exist. The description adds minimal behavioral 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 concise: a one-sentence purpose, a parameter description, and a usage example. Every part is direct and useful. No wasted words, and the structure front-loads the core action.

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?

Given the existence of an output schema, the description does not need to detail return values. However, it lacks context about whose recent games are listed (implicitly the authenticated user) and fails to differentiate from the sibling 'chess_player_stats' which also lists recent games. The tool is simple, but the description could be more complete to avoid ambiguity.

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?

Schema description coverage is 0%, so the description must compensate. It effectively clarifies the 'limit' parameter with 'Number of games to list (default 5)', which adds meaning beyond the schema's type and default. The example reinforces usage. This is adequate for a single parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List your most recent games,' identifying the verb (list) and resource (games). It distinguishes from sibling 'chess_last_match' (single game) but does not specify that the games belong to the authenticated user, leaving room for confusion with 'chess_player_stats'.

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 offers no guidance on when to use this tool versus siblings like 'chess_last_match' or 'chess_player_stats'. It does not indicate prerequisites (e.g., authentication) or scenarios where an alternative would be better, leaving the agent to infer usage context.

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

roll_diceA

Roll dice with the given notation.

Parameters:

  • notation: Dice notation like "2d6+1"

  • num_rolls: Number of times to roll (default 1)

Example:

  • roll_dice("3d6", 2)

ParametersJSON Schema
NameRequiredDescriptionDefault
notationYes
num_rollsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/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 burden. It only states the action without disclosing behavioral traits like randomness, error handling, valid notation range, or return format. This is insufficient for a tool with no annotations.

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 two sentences, a parameter list, and an example. Every element earns its place, and the main action is front-loaded.

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?

Given the tool's low complexity and the presence of an output schema, the description is adequate. It covers the basic usage and parameters, though it could be improved by noting that the output is a list of results.

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 0% description coverage, so the description compensates by explaining 'notation: Dice notation like 2d6+1' and 'num_rolls: Number of times to roll (default 1)'. This adds meaningful context beyond the schema's type and title.

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 'Roll dice with the given notation' using a specific verb and resource. It is distinct from sibling tools, all of which are chess-related, so there is no ambiguity.

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?

While the purpose is clear, the description does not explicitly state when to use this tool versus alternatives or provide exclusions. Since there are no competing dice-rolling tools among siblings, the lack of guidance is less critical, but still missing.

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. 10 tool updatesv0.1.0
    • First observedchess
    • First observedchess_analyze_game_id
    • First observedchess_analyze_multiple_pgn
    • First observedchess_analyze_pgn
    • First observedchess_analyze_recent_game
    • First observedchess_last_match
    • First observedchess_player_stats
    • First observedchess_recent_matches
    • First observedroll_dice
    • First observedweb_search

TDQS

B3.1/5.0

Scored across 10 tools

Disambiguation3/5

Most chess tools are clearly distinct (stats, matches, analysis by PGN or ID), but the generic 'chess' tool duplicates all their functionality, creating ambiguity about which tool to use. web_search and roll_dice are unrelated and easy to distinguish.

Naming Consistency3/5

web_search and roll_dice use verb_noun pattern consistently. Chess tools mostly follow chess_verb_noun but include exceptions like 'chess_player_stats' (noun_noun) and 'chess_recent_matches' (adjective_noun). The plain 'chess' tool breaks the pattern entirely.

Tool Count3/5

10 tools is a reasonable number, but the inclusion of the redundant 'chess' tool and the mix of unrelated domains (web search, dice, chess) makes the surface feel slightly bloated. Could be streamlined by removing the generic chess tool.

Completeness3/5

The chess subdomain covers stats, recent matches, and PGN analysis well, but lacks features like game archiving or move-by-move play. web_search and roll_dice are single-purpose and complete. Overall the surface is adequate but not deep in any area.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    C
    quality
    D
    maintenance
    An MCP protocol server that enables web search functionality using the Tavily API, allowing AI assistants to perform internet searches in real-time.
    4
    4
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for using various search tools like Tavily API. Planning to support various search tools (i.e. wiki search, searxng, etc)
    3
    MIT