This is an automated email from the ASF dual-hosted git repository.
freeoneplus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-mcp-server.git
The following commit(s) were added to refs/heads/master by this push:
new 693c48d [BUG]Fixed startup errors caused by multiple versions of MCP
services (#13)
693c48d is described below
commit 693c48d5ee5b5d7d76c9bf09c712fa0b90377239
Author: Yijia Su <[email protected]>
AuthorDate: Thu Jul 3 15:04:16 2025 +0800
[BUG]Fixed startup errors caused by multiple versions of MCP services (#13)
* fix at_eof bug
* update uv.lock
* fix bug and change pool min values
* Fixed startup errors caused by multiple versions of MCP services
---
doris_mcp_server/main.py | 209 ++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 187 insertions(+), 22 deletions(-)
diff --git a/doris_mcp_server/main.py b/doris_mcp_server/main.py
index ce9aab3..eb02ca9 100644
--- a/doris_mcp_server/main.py
+++ b/doris_mcp_server/main.py
@@ -28,26 +28,183 @@ import json
import logging
from typing import Any
-# MCP version compatibility check
-try:
- import mcp
- MCP_VERSION = getattr(mcp, '__version__', 'unknown')
- logger = logging.getLogger(__name__)
- logger.info(f"Using MCP version: {MCP_VERSION}")
-except Exception as e:
- logger = logging.getLogger(__name__)
- logger.warning(f"Could not determine MCP version: {e}")
- MCP_VERSION = 'unknown'
-
-from mcp.server import Server
-from mcp.server.models import InitializationOptions
-
-from mcp.types import (
- Prompt,
- Resource,
- TextContent,
- Tool,
-)
+# MCP version compatibility handling
+MCP_VERSION = 'unknown'
+Server = None
+InitializationOptions = None
+Prompt = None
+Resource = None
+TextContent = None
+Tool = None
+
+def _import_mcp_with_compatibility():
+ """Import MCP components with multi-version compatibility"""
+ global MCP_VERSION, Server, InitializationOptions, Prompt, Resource,
TextContent, Tool
+
+ try:
+ # Strategy 1: Try direct server-only imports to avoid client-side
issues
+ from mcp.server import Server as _Server
+ from mcp.server.models import InitializationOptions as _InitOptions
+ from mcp.types import (
+ Prompt as _Prompt,
+ Resource as _Resource,
+ TextContent as _TextContent,
+ Tool as _Tool,
+ )
+
+ # Assign to globals
+ Server = _Server
+ InitializationOptions = _InitOptions
+ Prompt = _Prompt
+ Resource = _Resource
+ TextContent = _TextContent
+ Tool = _Tool
+
+ # Try to get version safely
+ try:
+ import mcp
+ MCP_VERSION = getattr(mcp, '__version__', None)
+ if not MCP_VERSION:
+ # Fallback: try to get version from package metadata
+ try:
+ import importlib.metadata
+ MCP_VERSION = importlib.metadata.version('mcp')
+ except Exception:
+ # Second fallback: try pkg_resources
+ try:
+ import pkg_resources
+ MCP_VERSION =
pkg_resources.get_distribution('mcp').version
+ except Exception:
+ MCP_VERSION = 'detected-but-version-unknown'
+ except Exception:
+ # Version detection failed, but imports worked
+ try:
+ import importlib.metadata
+ MCP_VERSION = importlib.metadata.version('mcp')
+ except Exception:
+ try:
+ import pkg_resources
+ MCP_VERSION = pkg_resources.get_distribution('mcp').version
+ except Exception:
+ MCP_VERSION = 'imported-successfully'
+
+ logger = logging.getLogger(__name__)
+ logger.info(f"MCP components imported successfully, version:
{MCP_VERSION}")
+ return True
+
+ except Exception as import_error:
+ logger = logging.getLogger(__name__)
+
+ # Strategy 2: Handle RequestContext compatibility issues in 1.9.x
versions
+ error_str = str(import_error).lower()
+ if 'requestcontext' in error_str and 'too few arguments' in error_str:
+ logger.warning(f"Detected MCP RequestContext compatibility issue:
{import_error}")
+ logger.info("Attempting comprehensive workaround for MCP 1.9.x
RequestContext issue...")
+
+ try:
+ # Comprehensive monkey patch approach
+ import sys
+ import types
+
+ # Create and install mock modules before any MCP imports
+ if 'mcp.shared.context' not in sys.modules:
+ mock_context_module =
types.ModuleType('mcp.shared.context')
+
+ class FlexibleRequestContext:
+ """Flexible RequestContext that accepts variable
arguments"""
+ def __init__(self, *args, **kwargs):
+ self.args = args
+ self.kwargs = kwargs
+
+ def __class_getitem__(cls, params):
+ # Accept any number of parameters and return cls
+ return cls
+
+ # Add other methods that might be called
+ def __getattr__(self, name):
+ return lambda *args, **kwargs: None
+
+ mock_context_module.RequestContext = FlexibleRequestContext
+ sys.modules['mcp.shared.context'] = mock_context_module
+
+ # Also patch the typing system to be more permissive
+ original_check_generic = None
+ try:
+ import typing
+ if hasattr(typing, '_check_generic'):
+ original_check_generic = typing._check_generic
+ def permissive_check_generic(cls, params, elen):
+ # Don't enforce strict parameter count checking
+ return
+ typing._check_generic = permissive_check_generic
+ except Exception:
+ pass
+
+ # Clear any cached imports that might have failed
+ modules_to_clear = [k for k in sys.modules.keys() if
k.startswith('mcp.')]
+ for module in modules_to_clear:
+ if module in sys.modules:
+ del sys.modules[module]
+
+ # Now try importing again with the patches in place
+ from mcp.server import Server as _Server
+ from mcp.server.models import InitializationOptions as
_InitOptions
+ from mcp.types import (
+ Prompt as _Prompt,
+ Resource as _Resource,
+ TextContent as _TextContent,
+ Tool as _Tool,
+ )
+
+ # Assign to globals
+ Server = _Server
+ InitializationOptions = _InitOptions
+ Prompt = _Prompt
+ Resource = _Resource
+ TextContent = _TextContent
+ Tool = _Tool
+
+ # Try to detect actual version even in compatibility mode
+ try:
+ import importlib.metadata
+ actual_version = importlib.metadata.version('mcp')
+ MCP_VERSION = f'compatibility-mode-{actual_version}'
+ except Exception:
+ try:
+ import pkg_resources
+ actual_version =
pkg_resources.get_distribution('mcp').version
+ MCP_VERSION = f'compatibility-mode-{actual_version}'
+ except Exception:
+ MCP_VERSION = 'compatibility-mode-1.9.x'
+
+ logger.info("MCP 1.9.x compatibility workaround successful!")
+
+ # Restore original typing function if we patched it
+ if original_check_generic:
+ typing._check_generic = original_check_generic
+
+ return True
+
+ except Exception as workaround_error:
+ logger.error(f"MCP compatibility workaround failed:
{workaround_error}")
+
+ # Restore original typing function if we patched it
+ if original_check_generic:
+ try:
+ import typing
+ typing._check_generic = original_check_generic
+ except Exception:
+ pass
+
+ logger.error(f"Failed to import MCP components: {import_error}")
+ return False
+
+# Perform MCP import with compatibility handling
+if not _import_mcp_with_compatibility():
+ raise ImportError(
+ "Failed to import MCP components. Please ensure MCP is properly
installed. "
+ "Supported versions: 1.8.x, 1.9.x"
+ )
from .tools.tools_manager import DorisToolsManager
from .tools.prompts_manager import DorisPromptsManager
@@ -234,8 +391,16 @@ class DorisServer:
await self.connection_manager.initialize()
self.logger.info("Connection manager initialization completed")
- # Start stdio server - using simpler approach
- from mcp.server.stdio import stdio_server
+ # Start stdio server - using compatible import approach
+ try:
+ from mcp.server.stdio import stdio_server
+ except ImportError:
+ # Fallback for different MCP versions
+ try:
+ from mcp.server import stdio_server
+ except ImportError as stdio_import_error:
+ self.logger.error(f"Failed to import stdio_server:
{stdio_import_error}")
+ raise RuntimeError("stdio_server module not available in
this MCP version")
self.logger.info("Creating stdio_server transport...")
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]