A .NET framework for building MCP (Model Context Protocol) servers that expose tools over stdin/stdout using JSON-RPC 2.0. Compatible with Claude Desktop, Claude Code, and any MCP client.
McpToolkit.NET provides 6 tools with explicit schemas and descriptions. All tools have names starting with action verbs (read_, list_, write_, describe_, execute_). Descriptions are present but vary in quality, some are strong (read_file: 'Read the text contents of a file within allowed directories'), others lack actionable context (execute_query lacks guidance on when to use it vs describe_table). Parameters have type definitions and descriptions, but several lack constraints (e.g., execute_query's 'sql' param accepts free-form strings with no injection guidance; 'max_rows' is a string type instead of integer). Output schemas are not documented in the source. Error handling is basic, no recovery guidance or categorization. No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels. write_file is destructive but lacks confirmation/dry-run pattern.
Get column definitions (name, type, nullable, default) for a specific table. Use before writing queries to understand the schema.
Execute a read-only SQL SELECT query against the database. Returns results as a markdown table. Never use INSERT/UPDATE/DELETE.
List files and subdirectories in a directory.
List all user tables in the SQL Server database with their row counts. Call this first to understand the database schema before writing queries.
Read the text contents of a file within allowed directories.
Write text to a file. Creates the file and parent directories if needed.
execute_query accepts free-form SQL strings with no injection validation or guidance. Parameter 'sql' lacks format constraints, regex patterns, or LLM-facing warnings about SQL injection risks.
write_file is destructive (overwrites/creates files) but lacks confirmation pattern, dry-run option, or tool annotation (destructiveHint). Agents cannot safely preview changes before committing.
Output schemas are not documented. LLMs cannot infer what fields execute_query, list_tables, or describe_table return, forcing them to guess downstream field names and risking broken tool chains.
execute_query's 'max_rows' parameter is typed as string instead of integer, and lacks min/max bounds. LLMs may pass invalid values like 'all' or '999999', causing API errors or timeouts.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | <=2025-11-25 | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. Agents cannot distinguish safe tools from destructive ones without parsing descriptions.