@mcp.tool()
def get_instance_info(ip_address: str, provider: Optional[str] = None) -> Dict:
"""
根据IP地址自动检测云服务提供商并获取实例信息
Args:
ip_address (str): 公网IP地址
provider (str, optional): 明确指定的云服务提供商 ('aws', 'digitalocean', 'vultr', 'alibaba')
Returns:
Dict: 实例信息,包含提供商信息和实例详情
"""
# 如果用户明确指定了云服务提供商,直接使用
if provider:
provider_name = provider.lower()
if provider_name not in PROVIDERS:
return {
'error': f'不支持的云服务提供商: {provider_name}',
'supported_providers': list(PROVIDERS.keys()),
'suggestion': f'请使用以下支持的提供商之一: {", ".join(PROVIDERS.keys())}'
}
# 直接使用指定的提供商,跳过IP检测
provider_obj = PROVIDERS[provider_name]
provider_info = get_cloud_provider_info(provider_name)
print(f"🎯 用户指定云服务提供商: {provider_info['name']}")
else:
# 检测云服务提供商
print("🔍 正在检测IP地址对应的云服务提供商...")
provider_name = detect_cloud_provider(ip_address, IPINFO_API_TOKEN)
provider_info = get_cloud_provider_info(provider_name)
if provider_name == 'unknown':
return {
'error': '无法识别IP地址对应的云服务提供商',
'ip_address': ip_address,
'detected_provider': 'unknown',
'suggestion': '请手动指定云服务提供商或检查IP地址是否正确',
'supported_providers': list(PROVIDERS.keys()),
'manual_usage': '您可以在调用时添加 provider 参数来明确指定云厂商,例如:get_instance_info(ip_address="1.2.3.4", provider="aws")'
}
# 获取对应的提供商
provider_obj = PROVIDERS.get(provider_name)
if not provider_obj:
return {
'error': f'不支持的云服务提供商: {provider_name}',
'detected_provider': provider_name,
'supported_providers': list(PROVIDERS.keys())
}
print(f"✅ 检测到云服务提供商: {provider_info['name']}")
# 检查提供商是否可用
if not getattr(provider_obj, 'available', False):
error_msg = getattr(provider_obj, 'error', '提供商不可用')
return {
'error': f'{provider_info["name"]} 提供商不可用: {error_msg}',
'provider': provider_name,
'provider_info': provider_info,
'suggestion': '请检查相关环境变量是否正确配置'
}
# 调用提供商的查询方法
print(f"🔍 正在查询 {provider_info['name']} 实例信息...")
try:
if provider_name == 'aws':
result = provider_obj.get_instance_by_ip(ip_address)
elif provider_name == 'digitalocean':
result = provider_obj.get_droplet_by_ip(ip_address)
elif provider_name == 'vultr':
result = provider_obj.get_instance_by_ip(ip_address)
elif provider_name == 'alibaba':
result = provider_obj.get_instance_by_ip(ip_address)
else:
return {
'error': f'提供商 {provider_name} 的查询方法未实现',
'detected_provider': provider_name
}
# 添加检测信息到结果中
result['detected_provider'] = provider_name if not provider else f'{provider_name} (用户指定)'
result['provider_info'] = provider_info
result['search_ip'] = ip_address
return result
except Exception as e:
return {
'error': f'查询 {provider_info["name"]} 实例时发生错误: {str(e)}',
'provider': provider_name,
'provider_info': provider_info,
'search_ip': ip_address
}