Skip to main content
Glama
plasmacat420

MCP Server Toolkit

by plasmacat420

MCP Server Toolkit

A production-ready MCP server exposing filesystem, web search, SQLite, and system tools — plug directly into Claude Desktop or any MCP-compatible client.

Python License CI Docker


What is MCP?

The Model Context Protocol is an open standard that lets AI assistants like Claude securely call external tools — giving them real-time access to your filesystem, databases, and the web without you having to paste content into the chat manually.


Related MCP server: ABSD DevOps MCP Server

Features

  • Filesystemread_file returns any text file with numbered lines; search_files globs a directory tree. Both tools enforce a configurable ROOT_DIR so path-traversal attacks are impossible.

  • Web Searchweb_search queries DuckDuckGo's free JSON API. No API key, no rate limits, async with a 10 s timeout.

  • SQLitequery_sqlite runs SELECT-only queries and returns typed columns + rows; list_tables shows the schema at a glance.

  • Systemget_system_info snapshots OS, Python version, CPU count, memory usage, free disk, hostname, and uptime in one call.


Quick Start

Option 1 — pip

pip install git+https://github.com/plasmacat420/mcp-server-toolkit.git
mcp-toolkit          # starts the server on stdio (Claude Desktop mode)

Option 2 — Docker

docker pull ghcr.io/plasmacat420/mcp-server-toolkit:latest
docker run -it ghcr.io/plasmacat420/mcp-server-toolkit:latest

Option 3 — Docker Compose (recommended for SSE / networked use)

git clone https://github.com/plasmacat420/mcp-server-toolkit
cd mcp-server-toolkit
cp .env.example .env          # edit ROOT_DIR if needed
docker compose up

The SSE endpoint is then available at http://localhost:8000.


Claude Desktop Integration

Add the following block to claude_desktop_config.json (~/Library/Application Support/Claude/ on macOS, %APPDATA%\Claude\ on Windows):

{
  "mcpServers": {
    "mcp-toolkit": {
      "command": "mcp-toolkit",
      "env": {
        "ROOT_DIR": "/Users/you/projects"
      }
    }
  }
}

Restart Claude Desktop — the four tool categories appear automatically in every conversation.


Tool Reference

Tool

Description

Parameters

Returns

read_file

Read a text file with line numbers

path: str

{content, path, lines, size_bytes}

search_files

Glob-search inside a directory

directory: str, pattern: str, recursive: bool = True

{results[], count}

web_search

DuckDuckGo search (no key needed)

query: str, max_results: int = 5

{results[], query, count}

query_sqlite

Execute a SELECT query

db_path: str, sql: str

{columns[], rows[], row_count}

list_tables

List all tables in a SQLite DB

db_path: str

{tables[], count}

get_system_info

Host OS / resource snapshot

(none)

{os, cpu_count, memory_gb, …}


CLI Usage

The mcp-client binary lets you call any tool from your terminal:

# Search for Python files
mcp-client search-files . "*.py"
# {"results": [...], "count": 12}

# Read a file
mcp-client read-file src/mcp_toolkit/server.py
# {"content": "   1 | \"\"\"MCP Server Toolkit...", "lines": 34, ...}

# Web search
mcp-client web-search "python asyncio tutorial" --max-results 3
# {"results": [{"title": "...", "url": "...", "snippet": "..."}], ...}

# Query a SQLite database
mcp-client query-db examples/sample.db "SELECT name, email FROM users LIMIT 3"
# {"columns": ["name", "email"], "rows": [["Alice Johnson", "alice@..."]], ...}

# System snapshot
mcp-client system-info
# {"os": "Linux", "cpu_count": 8, "memory_gb": 15.87, ...}

# Full demo against sample.db
mcp-client demo

Development

git clone https://github.com/plasmacat420/mcp-server-toolkit
cd mcp-server-toolkit

# Install with dev extras
pip install -e ".[dev]"

# Create the sample database
python examples/create_db.py

# Run the test suite
pytest -v

# Lint + format check
ruff check .
ruff format --check .

# Auto-fix
ruff check . --fix && ruff format .

# Full demo (requires sample.db)
python examples/demo.py

Running a single test

pytest tests/test_filesystem.py::test_read_file_success -v

Architecture

The server is built on FastMCP, which handles the MCP wire protocol. Each tool category lives in its own module under src/mcp_toolkit/tools/; the modules export plain async functions that know nothing about MCP. server.py creates the FastMCP instance, imports every tool function, and registers them with mcp.tool(). Configuration is a single pydantic-settings BaseSettings object (config.py) that reads from environment variables or a .env file. The CLI client (client/cli.py) imports the same async functions directly — no MCP protocol involved — making it easy to smoke-test individual tools.

src/mcp_toolkit/
├── server.py        ← FastMCP app + tool registration
├── config.py        ← pydantic-settings Settings singleton
└── tools/
    ├── filesystem.py   read_file, search_files
    ├── websearch.py    web_search
    ├── database.py     query_sqlite, list_tables
    └── system.py       get_system_info

License

MIT © plasmacat420

Available Tools

6 tools
get_system_infoA

Return a snapshot of the host system's resource usage and identity.

Returns: Dict with keys os, os_version, python_version, cpu_count, memory_gb, memory_used_pct, disk_free_gb, hostname, and uptime_hours, or {"error": message} on failure.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It discloses possible failure with an error message dict, and lists all return keys. This is transparent about behavior, though it could mention if it's a read-only operation or has no side effects.

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?

Extremely concise: one sentence plus a list. Front-loads the purpose immediately. Every piece of information is necessary and well-structured.

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?

For a tool with zero parameters and an existing output schema, the description is complete. It covers purpose, return format, and failure mode. No additional context is needed.

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?

No parameters; baseline 4. Description adds value by detailing the return keys, which compensates for lack of parameters and provides useful context beyond the schema.

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?

Description explicitly states it returns a snapshot of host system resource usage and identity, and lists the specific keys. This is a specific verb+resource combination, clearly distinguishing it from siblings like list_tables or web_search.

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?

No guidance on when to use versus alternatives. While the purpose is clear, the description does not mention when to use this tool instead of other info-gathering tools, nor any prerequisites or context.

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

list_tablesB

List all user-defined tables in a SQLite database.

ParametersJSON Schema
NameRequiredDescriptionDefault
db_pathYesPath to the SQLite database file.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations provided, the description carries full responsibility for behavioral disclosure. It only states 'list all user-defined tables,' implying a read-only operation, but does not describe failure modes, performance implications, or any side effects.

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, concise sentence that communicates the tool's purpose without any extraneous or redundant information, making it highly efficient.

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?

Despite being a simple tool with one parameter, the description omits details like return format or distinction from system tables. However, an output schema exists, reducing the need for return value documentation. The description is mostly adequate.

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?

The schema covers 100% of parameters with a description for 'db_path.' The tool description adds no further meaning beyond 'Path to the SQLite database file,' so it meets the baseline without enhancement.

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 verb 'List' and the resource 'user-defined tables in a SQLite database,' which is specific and distinguishes this tool from siblings like query_sqlite (which queries data) and read_file (which reads file contents).

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 given on when to use this tool versus alternatives such as query_sqlite or search_files. The description does not mention exclusions or prerequisites, leaving the agent to infer usage without context.

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

query_sqliteA

Execute a SELECT query against a SQLite database file.

Only SELECT statements are permitted; any other statement type returns an error without touching the database.

ParametersJSON Schema
NameRequiredDescriptionDefault
db_pathYesPath to the SQLite database file.
sqlYesSQL SELECT statement to execute.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/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. It clearly discloses the critical behavioral trait that only SELECT is allowed and that other statements are safely rejected without affecting the database.

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?

Two efficient sentences: the first states purpose, the second adds a key restriction. No wasted words, front-loaded with essential information.

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 simplicity of the tool (two parameters, output schema present), the description covers the purpose, behavior, and constraints completely. The sibling tools provide additional context for user guidance.

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 coverage is 100% with descriptions for both parameters. The description adds no additional semantic meaning beyond reinforcing the SELECT restriction, which is already in the schema. Baseline 3 is appropriate.

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 it executes a SELECT query on a SQLite database file, using a specific verb and resource. It distinguishes itself from siblings like list_tables and read_file by specifying the query execution context.

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 explicitly states when to use (for SELECT queries) and when not to (any other statement returns error). It does not mention alternatives like list_tables for schema inspection, but the sibling list provides context.

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

read_fileA

Read a text file and return its content with line numbers.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to the file. Relative paths are resolved against ROOT_DIR.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description bears full burden. It discloses the return format (content with line numbers) but lacks details on error handling, file size limits, or encoding. The output schema exists but is not described here.

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 a single, front-loaded sentence that clearly conveys the tool's purpose. It is efficient, though a bit more structure (e.g., listing key behaviors) could improve scannability.

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 simplicity and the presence of an output schema, the description covers the essential action and return format. However, it omits details on error conditions like file not found or non-text files.

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 100% for the 'path' parameter. The description adds context about relative paths being resolved against ROOT_DIR, which is beyond what the schema provides.

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 it reads a text file and returns content with line numbers. It specifies the verb 'read' and resource 'text file', distinguishing it from sibling tools like search_files or query_sqlite.

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?

No explicit guidance on when to use this tool vs alternatives like search_files. Usage is implied (when you need to read a specific file), but no exclusions or when-not-to-use scenarios are mentioned.

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

search_filesB

Search for files matching a glob pattern inside a directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
directoryYesDirectory to search. Relative paths are resolved against ROOT_DIR.
patternYesGlob pattern (e.g. ``"*.py"``).
recursiveNoWhen True uses ``rglob``; otherwise uses ``glob``.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

No annotations provided, so description must fully disclose behavior. It only states it searches for files, not whether it is read-only, if it follows symlinks, or if there are limits on results. Key traits like side effects (none expected) are not mentioned.

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?

Single sentence, 11 words, directly front-loaded with the tool's purpose. No wasted words.

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?

With no annotations and minimal description, critical context is missing: what the output contains (list of file paths?), behavior for large directories, and whether it is purely read-only. Output schema exists but is not described.

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 coverage is 100%, so parameters are well-documented. The description adds no extra detail beyond the schema descriptions, but it provides a concise summary. Baseline score of 3 is appropriate.

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?

Clearly states the tool searches for files using a glob pattern within a directory. The verb 'search' and resource 'files' are specific, and it distinguishes from sibling tools like read_file (which reads a single file) and query_sqlite (database query).

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?

Usage is implicit: use when you need to find files by pattern. However, there is no explicit guidance on when not to use it or alternatives (e.g., read_file for reading file content, or get_system_info for system details).

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. 6 tool updatesv0.1.0
    • First observedget_system_info
    • First observedlist_tables
    • First observedquery_sqlite
    • First observedread_file
    • First observedsearch_files
    • First observedweb_search

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a clearly distinct domain: system info, SQLite tables, SQL queries, file reading, file search, and web search. No overlap in functionality.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (e.g., get_system_info, list_tables, query_sqlite, read_file, search_files, web_search), making predictions easy.

Tool Count5/5

6 tools is a well-scoped number for a general-purpose toolkit, covering system, database, file, and web operations without being excessive or sparse.

Completeness3/5

The toolkit lacks write operations for files (e.g., write_file) and SQL modifications (insert/update/delete), limiting its usefulness for common tasks. This is a notable gap for a general toolkit.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    A modular server implementation for Claude AI assistants with integrated tools, enabling Claude to perform actions and access external resources like file systems, web searches, browser automation, financial data, and document generation.
    107
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables secure local filesystem operations and interactive terminal sessions for AI assistants. Provides 12 tools for file management, directory operations, code searching, and running interactive REPLs with security protections.
    11 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI tools like Claude to interact with a remote machine's file system and shell via a secure HTTPS endpoint. It provides standardized tools for executing shell commands, reading and writing files, and navigating directories.
    -