MANNA

MANNA

An MCP server exposing IVOA-compliant astronomical archives (NOIRLab Astro Data Lab, NRAO/ALMA, CADC, ESO, Gaia, …) to LLM clients.

Category
访问服务器

README

MANNA

MANNA — MCP Architecture for NOIRLab and NRAO Archives.

An MCP server exposing IVOA-compliant astronomical archives (NOIRLab Astro Data Lab, NRAO/ALMA, CADC, ESO, Gaia, …) to LLM clients.

Naming: MANNA in prose (it's an acronym); lowercase manna for every identifier — the Python package, python -m manna, the manna:dev image tag, and the MCP client alias (mcp__manna__*).

Tools

Tool Protocol Description
vo_archive_list — List known archives with endpoint URLs and usage notes
vo_schema_describe — Curated per-table schema facts (missing columns, enum values, spatial index hints)
vo_target_resolve Sesame Resolve an object name (e.g. "M87", "Cygnus A") to RA/Dec coordinates
vo_tap_query TAP Submit sync or async ADQL queries; returns inline or promoted results
vo_tap_status TAP Poll an async job by ID
vo_tap_results TAP Return a completed async job's result URL + pyvo fetch recipe (client fetches the data)
vo_tap_abort TAP Abort a running async job
vo_registry_search RegTAP Search the IVOA registry by keyword or service type
vo_registry_describe RegTAP Describe a specific registry resource (columns, capabilities)
vo_cone_search SCS Simple Cone Search for legacy SCS-only archives
vo_sia_search SIA 2.0 Search for images by position and waveband (returns access URLs to fetch client-side)
vo_find_observations SIA 2.0 / SCS One-call facade: resolves a target name or coordinates, auto-selects an archive by service/waveband, then runs the SIA (image) or SCS (catalog) search — chains vo_target_resolve + vo_archive_list + vo_sia_search/vo_cone_search so the model doesn't have to

The recommended LLM workflow for a positional query:

  1. vo_target_resolve — get RA/Dec for a named object
  2. vo_archive_list — discover the archive and its endpoint
  3. vo_schema_describe — get table-specific quirks before writing ADQL
  4. vo_registry_describe — live column introspection
  5. vo_tap_query (mode=async for data reads) — run the query

Quickstart

uv sync
uv run pytest --record-mode=none        # 657 tests, offline replay
uv run python -m manna                  # server on http://localhost:8000

Smoke test with MCP Inspector:

npx -y @modelcontextprotocol/inspector --cli http://localhost:8000/mcp --method tools/list

Development

uv sync                        # install runtime + dev deps
uv run pre-commit install      # enable git pre-commit hooks (once per clone)

uv run ruff check .            # lint
uv run ruff format .           # format
uv run pyright                 # type check (src/, basic mode)
uv run pre-commit run --all-files   # run every hook over the whole tree

Pre-commit runs ruff (lint + format), file-hygiene checks, and pyright on each commit; the full test suite runs in CI, not at commit time.

Branch flow (see CLAUDE.md for detail): feature branches <initials>/<name> branch off dev and PR into dev; dev is promoted to main via PR. main is protected — it only advances through PRs with passing CI.

Configuration

All settings are optional — defaults work for local dev. Set via environment variables prefixed MANNA_ or in a .env file:

Variable Default Description
MANNA_PORT 8000 HTTP listen port
MANNA_HOST 0.0.0.0 Bind address
MANNA_LOG_LEVEL INFO DEBUG / INFO / WARNING / ERROR
MANNA_TAP_SYNC_TIMEOUT_SECONDS 20.0 Timeout for sync TAP queries
MANNA_ALLOWED_HOSTS (unset) Comma-separated hostnames the server may fetch (exact or subdomain match). Unset ⇒ any public host; private/loopback/link-local targets are refused regardless
MANNA_ARCHIVES (unset) Comma-separated archive short_names to activate. Unset/empty ⇒ all archives physically present in archives/
MANNA_INLINE_ROW_LIMIT 200 Max rows in an inline result before it's routed to an async job (TAP) or truncated (cone/SIA)
MANNA_INLINE_BYTE_LIMIT 49152 Max bytes in an inline result before the same promotion/truncation applies (48 KiB)
MANNA_REGISTRY_DESCRIBE_BYTE_LIMIT 49152 Above this, vo_registry_describe degrades from per-column detail to a table catalog (names + descriptions + column counts)

See .env.example for a template.

Docker

docker build -t manna:dev .
docker run -p 8000:8000 manna:dev

Forking for a specific deployment

This repo is the multi-archive base. Each archive is one self-contained file — its endpoints, usage notes, and per-table schemas all live in src/manna/archives/<short_name>.py. Shape which archives make curated claims two ways:

  • Physical — delete the unwanted src/manna/archives/<short_name>.py files. Discovery picks up whatever remains; no other file needs touching.
  • Runtime — set MANNA_ARCHIVES=datalab,alma (comma-separated short_names) to narrow a shared image without deleting files. Unset/empty ⇒ every archive active.

A dropped or deselected archive loses only the server's curated claims about it — never its reachability. It's still reachable via vo_registry_search.

Refreshing recorded cassettes

Tests replay archive HTTP traffic from YAML cassettes in tests/<area>/cassettes/. To refresh a stale cassette:

# requires network access to the archive endpoint
rm tests/<area>/cassettes/<test_module>/<test_name>.yaml
uv run pytest tests/<area>/<test_module>.py::<test_name> --record-mode=once

Inspect the cassette diff before committing — large changes in the VOTable namespace URI or response headers may indicate an upstream breaking change.

Docs

Deployment configurations are maintained in a separate repository.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选