一个模块化的模型上下文协议(MCP)服务器,通过清晰且可扩展的架构提供对多个天文数据集的统一访问。
此MCP服务器旨在将大数据天文学从一个软件工程问题转变为一种自然语言对话。研究人员无需花费数月时间学习astroquery API,只需询问他们需要什么,就能获得干净、处理过的、可用于分析的数据产品。
一位专家解决了一次复杂的问题;成千上万的科学家将永远受益。现在,即使编程经验很少的学生也能使用自然语言和AI助手执行与专家天文学家相同的多调查分析。
这不仅仅是关于天文学——这是一个使所有科学民主化的模板。每个领域都有杰出的研究人员花费80%的时间在数据整理上,而不是进行发现。通过消除这一瓶颈,我们加速了科学进步的步伐。
结果:能够无缝访问并交叉匹配来自数十个天文调查数据的AI科学家,使得几年前需要几个月设置才能尝试的发现成为可能。
# 克隆仓库
git clone https://github.com/SandyYuan/astro_mcp.git
cd astro_mcp
# 创建专用conda环境,Python 3.11+
conda create -n mcp python=3.11
conda activate mcp
# 安装依赖项
pip install -r requirements.txt
# 安装天文库以实现全部功能
pip install sparclclient datalab astropy astroquery
# 测试基本功能
python test_server.py
# 使用简单查询测试(可选)
python -c "
import asyncio
from server import astro_server
async def test():
result = astro_server.get_global_statistics()
print('✅ 服务器工作正常:', result['total_files'], '注册表中的文件')
services = astro_server.list_astroquery_services()
print(f'✅ Astroquery: 发现 {len(services)} 服务')
asyncio.run(test())
"
将以下配置添加到你的Cursor MCP设置中:
{
"mcpServers": {
"astro-mcp": {
"command": "/path/to/conda/envs/mcp/bin/python",
"args": ["/path/to/astro_mcp/server.py"],
"cwd": "/path/to/astro_mcp",
"env": {}
}
}
}
要找到你的conda Python路径:
conda activate mcp
which python
# 复制此路径用于上述的 "command" 字段
编辑你的Claude Desktop MCP配置文件:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"astro-mcp": {
"command": "/path/to/conda/envs/mcp/bin/python",
"args": ["/path/to/astro_mcp/server.py"],
"cwd": "/path/to/astro_mcp",
"env": {}
}
}
}
服务器无法启动:
# 检查Python环境
conda activate mcp
python --version # 应该是3.11+
# 手动测试服务器
python server.py
# 应该无错误启动
MCP连接问题:
cwd)指向astro_mcp文件夹缺少天文数据:
# 安装全部功能所需的可选依赖项
conda activate mcp
pip install sparclclient datalab astropy astroquery h5py
一旦配置完成,你可以用自然语言询问天文数据:
服务器将自动:
astro_mcp/
├── server.py # 主MCP服务器入口点
├── data_sources/ # 模块化数据源实现
│ ├── __init__.py
│ ├── base.py # 所有数据源的基础类
│ ├── desi.py # DESI调查数据访问
│ ├── astroquery_universal.py # Universal astroquery包装器
│ └── astroquery_metadata.py # 服务元数据和功能
├── data_io/ # 文件处理和转换
│ ├── __init__.py
│ ├── preview.py # 数据预览和结构分析
│ └── fits_converter.py # FITS格式转换
├── tests/ # 测试套件
├── examples/ # 使用示例
└── requirements.txt # 项目依赖项
快速开始: 对于Cursor & Claude Desktop集成,请参阅上面的快速设置部分。
# 克隆仓库
git clone https://github.com/SandyYuan/astro_mcp.git
cd astro_mcp
# 创建并激活环境
conda create -n mcp python=3.11
conda activate mcp
# 安装核心依赖项
pip install -r requirements.txt
# 安装天文库
pip install sparclclient datalab astropy astroquery
# 可选: 安装开发依赖项
pip install pytest coverage
# 测试服务器组件
python test_server.py
# 检查可用的astroquery服务
python -c "
import asyncio
from server import astro_server
async def show_services():
services = astro_server.list_astroquery_services()
print(f'✅ 发现 {len(services)} 个astroquery服务')
for service in services[:5]: # 显示前5个
print(f' - {service["full_name"]} ({service["service"]})')
asyncio.run(show_services())
"
python server.py
服务器提供了这些主要工具:
数据访问:
search_objects - 查找天文对象(DESI)astroquery_query - 跨越40多种天文服务的通用查询get_spectrum_by_id - 获取详细的光谱数据(DESI)服务发现:
list_astroquery_services - 显示所有可用的天文数据库get_astroquery_service_details - 详细的服务信息search_astroquery_services - 按条件查找服务文件管理:
preview_data - 检查保存的文件并进行结构分析list_files - 管理跨所有来源的保存数据file_statistics - 存储使用和组织信息convert_to_fits - 将数据转换为FITS格式# 从SIMBAD获取对象坐标
astroquery_query(
service_name="simbad",
object_name="Betelgeuse"
)
# 使用SQL搜索SDSS中的星系
astroquery_query(
service_name="sdss",
query_type="query_sql",
sql="SELECT TOP 10 ra, dec, z FROM SpecObj WHERE class='GALAXY' AND z BETWEEN 0.1 AND 0.3"
)
# 搜索VizieR目录
astroquery_query(
service_name="vizier",
ra=10.68,
dec=41.27,
radius=0.1
)
# 将结果转换为FITS
convert_to_fits(
identifier="search_results.csv",
data_type="catalog"
)
状态: ✅ 已完全实现
状态: ✅ 已完全实现
主要可用服务:
功能:
所需依赖项:
pip install astroquery astropy
# data_sources/my_survey.py
from .base import BaseDataSource
class MySurveyDataSource(BaseDataSource):
def __init__(self, base_dir=None):
super().__init__(base_dir=base_dir, source_name="my_survey")
# 初始化调查特定客户端
def search_objects(self, **kwargs):
# 实现调查特定搜索
pass
# server.py
from data_sources import MySurveyDataSource
class AstroMCPServer:
def __init__(self, base_dir=None):
# ... 现有代码 ...
self.my_survey = MySurveyDataSource(base_dir=base_dir)
astroquery集成会自动发现新服务。要添加自定义元数据:
# data_sources/astroquery_metadata.py
ASTROQUERY_SERVICE_INFO = {
"my_service": {
"full_name": "我的自定义服务",
"description": "自定义天文数据库",
"data_types": ["目录", "图像"],
"波长覆盖范围": "光学",
"对象类型": ["恒星", "星系"],
"需要认证": False,
"示例查询": [
{
"描述": "按对象名称搜索",
"查询": "astroquery_query(service_name='my_service', object_name='M31')"
}
]
}
}
文件会自动按数据源组织,并附带全面的元数据:
~/astro_mcp_data/
├── file_registry.json # 全局文件注册表及元数据
├── desi/ # DESI特定文件
│ ├── desi_search_*.json # 搜索结果
│ ├── spectrum_*.json # 光谱数据
│ └── *.fits # FITS转换
└── astroquery/ # Astroquery结果
├── astroquery_simbad_*.csv # SIMBAD查询
├── astroquery_sdss_*.csv # SDSS结果
├── astroquery_vizier_*.csv # VizieR目录
└── *.fits # FITS转换
# 运行所有测试
pytest
# 测试特定模块
pytest tests/test_desi.py
pytest tests/test_astroquery.py
# 测试覆盖率
pytest --cov=data_sources tests/
git checkout -b feature/new-capability)mcp>=1.0.0 - 模型上下文协议框架pandas>=2.0.0 - 数据操作numpy>=1.24.0 - 数值计算astroquery>=0.4.6 - 通用天文数据库访问astropy>=5.0.0 - FITS文件和天文计算sparclclient>=1.0.0 - DESI SPARCL访问datalab>=2.20.0 - NOAO Data Lab查询h5py>=3.8.0 - HDF5文件支持pytest>=7.0.0 - 测试框架[指定您的许可]
如果您在研究中使用了此软件,请引用:
@software{astro_mcp,
title={Astro MCP: 适用于AI代理的通用天文数据访问},
author={[您的姓名]},
year={2024},
url={[仓库URL]}
}