Skip to main content
Glama
OUARAS-khelil-Rafik

MCP Study Tools

๐ŸŽ“ MCP Study Tools โ€” Local MCP Study Assistant

A complete checkpoint project implementing a local Model Context Protocol (MCP) server for a study assistant.

โš ๏ธ Version compatibility

This project intentionally targets the FastMCP API:

from mcp.server.fastmcp import FastMCP

and pins the MCP SDK to:

mcp[cli]>=1.26,<2

This avoids the MCPServer import error that occurs when code written for a different SDK generation is mixed with a FastMCP-based installation.

The project also uses the official MCP stdio client:

from mcp import ClientSession
from mcp.client.stdio import StdioServerParameters, stdio_client

โœจ Checkpoint features

  • Local FastMCP server: MCP Study Tools

  • explain_topic

  • create_study_plan

  • generate_revision_checklist

  • Read-only project://course-outline

  • Read-only project://status

  • Structured validation errors

  • Empty-topic protection

  • Topic length and character validation

  • Study days clamped to 1โ€“14

  • Checklist items clamped to 1โ€“12

  • MCP client using stdio

  • Tool discovery

  • Multiple MCP tool calls

  • Agent-style routing

  • Explicit tool allow-list

  • Failure demonstration

  • Security documentation

  • Jupyter notebook

  • Pytest tests

๐Ÿ“ Structure

mcp-study-tools/
โ”œโ”€โ”€ server.py
โ”œโ”€โ”€ client_test.py
โ”œโ”€โ”€ requirements.txt
โ”œโ”€โ”€ pyproject.toml
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ docs/
โ”‚   โ””โ”€โ”€ mcp-checkpoint-report.md
โ”œโ”€โ”€ notebooks/
โ”‚   โ””โ”€โ”€ mcp_study_tools_walkthrough.ipynb
โ””โ”€โ”€ tests/
    โ””โ”€โ”€ test_server.py

๐Ÿš€ Installation on macOS/Linux

From the project folder:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt

Verify the SDK:

python -c "import mcp; print(mcp.__version__)"
python -c "from mcp.server.fastmcp import FastMCP; print('FastMCP OK')"

๐Ÿงช Run the client checkpoint

python client_test.py

The client launches server.py through the MCP stdio transport, initializes an MCP session, discovers the three tools, calls two tools, demonstrates an empty-input failure, and performs an agent-style routing example.

Expected discovery:

=== MCP TOOL DISCOVERY ===
[
  "explain_topic",
  "create_study_plan",
  "generate_revision_checklist"
]

๐Ÿ–ฅ๏ธ MCP Inspector

The CLI development command is:

mcp dev server.py

This starts the server through the MCP development/Inspector workflow.

๐Ÿ““ Jupyter

Open:

notebooks/mcp_study_tools_walkthrough.ipynb

It covers:

  • architecture

  • validation

  • direct tool behavior

  • MCP client connection

  • tool discovery

  • tool calls

  • failure handling

  • agent-style routing

  • checkpoint verification

๐Ÿ” Security

The tools are deliberately low-risk.

Input validation

Topics:

  • must be strings;

  • cannot be empty;

  • maximum 160 characters;

  • restricted to a simple human-readable character set.

Resource limits

Study days:

1..14

Checklist items:

1..12

Values outside these ranges are clamped.

No dangerous capabilities

The server does not:

  • execute shell commands;

  • execute arbitrary Python;

  • make network requests;

  • read secrets;

  • write arbitrary files;

  • mutate persistent application state.

Agent allow-list

Before an agent-style request is executed:

ensure_allowed(tool_name)

Only the three approved learning tools may be invoked.

โŒ Failure demonstration

Calling:

explain_topic("   ")

returns a structured error:

{
  "ok": false,
  "error": {
    "code": "EMPTY_TOPIC",
    "message": "Please provide a topic, for example 'Python functions'.",
    "field": "topic"
  }
}

The server does not crash.

๐Ÿงช Automated tests

pytest -q

๐Ÿ“š Official MCP references

๐Ÿ Requirement mapping

Requirement

Implementation

Python MCP SDK

requirements.txt

FastMCP server

server.py

3 required tools

server.py

Read-only resource

2 resources

Input validation

validate_topic()

Empty topic safe error

EMPTY_TOPIC

Day limit 1โ€“14

clamp_integer()

Client test

client_test.py

Agent demonstration

pick_tool() + ensure_allowed()

Failure documentation

docs/mcp-checkpoint-report.md

Jupyter

notebooks/*.ipynb

Comments/documentation

All Python files