From ce640e2ee53642f2c28a94e9aa94d4c0e0f9b134 Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Wed, 16 Jul 2025 14:51:04 -0600 Subject: [PATCH] Add tool wrappers for Claude Desktop compatibility (v1.0.3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add tool wrappers for all resource endpoints to ensure Claude Desktop can access them - Implement hybrid approach: resources for MCP spec compliance, tools for practical usage - Add 5 new tool wrappers: list_domains_tool, get_domain_tool, list_records_tool, get_record_tool, analyze_domain_tool - Update documentation to reflect the hybrid approach - Bump version to 1.0.3 This ensures compatibility with Claude Desktop while maintaining MCP best practices. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- CHANGELOG.md | 14 ++++++++ CLAUDE.md | 3 +- pyproject.toml | 2 +- src/vultr_dns_mcp/_version.py | 2 +- src/vultr_dns_mcp/fastmcp_server.py | 54 +++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f270e8..f833cfe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.0.3] - 2025-01-16 + +### Added +- Tool wrappers for resource access to ensure Claude Desktop compatibility + - `list_domains_tool()` - wrapper for dns://domains resource + - `get_domain_tool()` - wrapper for dns://domains/{domain} resource + - `list_records_tool()` - wrapper for dns://domains/{domain}/records resource + - `get_record_tool()` - wrapper for dns://domains/{domain}/records/{record_id} resource + - `analyze_domain_tool()` - wrapper for dns://domains/{domain}/analysis resource + +### Technical +- Hybrid approach: resources for direct MCP access, tools for Claude Desktop compatibility +- Maintains both patterns to support different MCP client implementations + ## [1.0.2] - 2025-01-16 ### Changed diff --git a/CLAUDE.md b/CLAUDE.md index 2aaff1b..3155d53 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -139,12 +139,13 @@ vultr-dns-mcp/ - 12 comprehensive DNS management tools - **Important**: FastMCP's `run()` method is synchronous, not async. Do not wrap with `asyncio.run()` -### MCP Tools (12 total) +### MCP Tools (17 total) - Domain management: list, create, delete, get details - DNS record operations: CRUD for all record types - Validation: Pre-creation validation with suggestions - Analysis: Configuration analysis with security recommendations - Setup utilities: Quick website and email DNS configuration +- Resource access tools: Tool wrappers for Claude Desktop compatibility ### Enhanced Error Handling - Custom exception hierarchy: VultrAPIError, VultrAuthError, VultrRateLimitError, etc. diff --git a/pyproject.toml b/pyproject.toml index 29a388a..40cda6b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "vultr-dns-mcp" -version = "1.0.2" +version = "1.0.3" description = "A comprehensive Model Context Protocol (MCP) server for managing Vultr DNS records" readme = "README.md" license = {text = "MIT"} diff --git a/src/vultr_dns_mcp/_version.py b/src/vultr_dns_mcp/_version.py index 9f7f9a1..2c7c7c0 100644 --- a/src/vultr_dns_mcp/_version.py +++ b/src/vultr_dns_mcp/_version.py @@ -1,4 +1,4 @@ """Version information for vultr-dns-mcp package.""" -__version__ = "1.0.2" +__version__ = "1.0.3" __version_info__ = tuple(int(i) for i in __version__.split(".") if i.isdigit()) diff --git a/src/vultr_dns_mcp/fastmcp_server.py b/src/vultr_dns_mcp/fastmcp_server.py index 57bac51..f4503b3 100644 --- a/src/vultr_dns_mcp/fastmcp_server.py +++ b/src/vultr_dns_mcp/fastmcp_server.py @@ -190,6 +190,60 @@ def create_vultr_mcp_server(api_key: Optional[str] = None) -> FastMCP: return records + # Tool wrappers for resources (for compatibility with Claude Desktop) + @mcp.tool + async def list_domains_tool() -> List[Dict[str, Any]]: + """List all DNS domains in your Vultr account. + + This is a tool wrapper for the dns://domains resource. + """ + return await list_dns_domains() + + @mcp.tool + async def get_domain_tool(domain: str) -> Dict[str, Any]: + """Get details for a specific DNS domain. + + Args: + domain: The domain name to get details for + + This is a tool wrapper for the dns://domains/{domain} resource. + """ + return await get_dns_domain(domain) + + @mcp.tool + async def list_records_tool(domain: str) -> List[Dict[str, Any]]: + """List all DNS records for a domain. + + Args: + domain: The domain name to list records for + + This is a tool wrapper for the dns://domains/{domain}/records resource. + """ + return await list_dns_records(domain) + + @mcp.tool + async def get_record_tool(domain: str, record_id: str) -> Dict[str, Any]: + """Get details for a specific DNS record. + + Args: + domain: The domain name + record_id: The record ID to get details for + + This is a tool wrapper for the dns://domains/{domain}/records/{record_id} resource. + """ + return await get_dns_record(domain, record_id) + + @mcp.tool + async def analyze_domain_tool(domain: str) -> Dict[str, Any]: + """Analyze DNS configuration for a domain and provide recommendations. + + Args: + domain: The domain name to analyze + + This is a tool wrapper for the dns://domains/{domain}/analysis resource. + """ + return await analyze_dns_records(domain) + return mcp