trackmcp
Back to directory

An MCP (Model Context Protocol) server providing tools to query Gravitational Wave (GW) data from GraceDB and GWOSC.

2 stars PythonOthers Updated Jan 20, 2026

Documentation

GW MCP Server

An MCP (Model Context Protocol) server providing tools to query Gravitational Wave (GW) data from GraceDB and GWOSC.

What is MCP?

MCP (Model Context Protocol) allows AI assistants like Claude to use external tools. This server gives Claude the ability to query gravitational wave databases in real-time, so you can ask questions about GW events in natural language.

Sample Questions

Once connected, you can ask Claude questions like:

  • "What was the GPS time of GW150914?"
  • "Show me all events in the GWTC-3 catalog"
  • "Get strain data from the Hanford detector around GW150914"
  • "Search for gravitational wave events with FAR less than 1e-10"
  • "What files are available for a specific GraceDB event?"

Example

Access Levels

SourcePublic AccessAuthenticated Access
GWOSCFull (strain data, catalogs)N/A
GraceDBReleased events onlyFull access to current observing run
GCN KafkaNoRequires NASA Earthdata credentials

This server works out-of-the-box with public data only.


Installation

Step 1: Create Conda Environment

bash
# Create new conda environment with Python 3.11
conda create -n opticsGPT python=3.11 -y

# Activate the environment
conda activate opticsGPT

Step 2: Install Dependencies

bash
cd C:\Users\Asus\Desktop\OpticsGPT\GW_MCP

# Install from requirements.txt
pip install -r requirements.txt

Step 3: Verify Installation

bash
# Test GWOSC (should print GPS time)
python -c "from gwosc.datasets import event_gps; print('GW150914 GPS:', event_gps('GW150914'))"

Usage with Claude Desktop

Add to `claude_desktop_config.json`:

Or create the file

json
{
  "mcpServers": {
    "GW-Data": {
      "command": "C:/Users/Asus/anaconda3/envs/mcp/python.exe",
      "args": ["C:/Users/Asus/Desktop/GW_MCP/server.py"]
    }
  }
}

> WARNING: You must update the paths below to match your system. Change:

> - The Python executable path to your conda environment location

> - The server.py path to where you cloned this repository

>

> Find your Python path with: `conda activate mcp && where python`



Using with Other LLMs and Frameworks

LangChain Integration

You can use this MCP server with LangChain using the `langchain-mcp-adapters` package:

bash
pip install langchain-mcp-adapters
python
from langchain_mcp_adapters.client import MCPClient
from langchain_openai import ChatOpenAI

# Connect to the MCP server
client = MCPClient(
    command="python",
    args=["path/to/GW_MCP/server.py"]
)

# Get tools from MCP server
tools = client.get_tools()

# Use with any LangChain-compatible LLM
llm = ChatOpenAI(model="gpt-4")
llm_with_tools = llm.bind_tools(tools)

Open Source LLMs

For open source LLMs (Ollama, LMStudio, etc.), you can:

1. Use MCP-compatible clients: Some open source projects like MCP CLI support connecting MCP servers to local LLMs.

2. Direct function calling: Import the service classes directly in your Python code:

python
from services.gracedb_service import get_gracedb_service
from services.gwosc_service import get_gwosc_service

# Use services directly
gwosc = get_gwosc_service()
gps_time = gwosc.get_event_gps("GW150914")
print(f"GPS time: {gps_time}")

3. Build a REST API: Wrap the services in a FastAPI/Flask server for any LLM that supports function calling via HTTP.


Available Tools

ToolSourceDescription
`search_gw_events`GraceDBSearch events by FAR, GPS time, pipeline
`get_event_details`GraceDBGet full metadata for an event
`get_superevent`GraceDBGet superevent information
`get_event_files`GraceDBList files (skymaps, PSD, etc.)
`get_event_labels`GraceDBGet event labels (DQV, PE_READY, etc.)
`get_event_gps`GWOSCGet GPS time for named event (GW150914, etc.)
`get_catalog_events`GWOSCQuery GWTC-1/2/3 catalogs
`fetch_strain_data`GWOSCGet strain time-series by GPS range
`fetch_event_strain`GWOSCGet strain centered on a named event

For LIGO/Virgo Collaboration Members

If you have LIGO credentials, you can access real-time alerts from the current observing run.

How GraceDB Authentication Works

By default, the `ligo-gracedb` client searches for credentials in this order:

1. SciToken at `/tmp/bt_u${UID}` or `SCITOKEN_FILE` environment variable

2. X.509 credentials from the `cred` parameter (cert/key pair or proxy file)

3. Environment variables: `X509_USER_CERT` + `X509_USER_KEY`

4. Environment variable: `X509_USER_PROXY`

5. Proxy from ligo-proxy-init: `/tmp/x509up_u${UID}`

6. Default location: `~/.globus/usercert.pem` and `~/.globus/userkey.pem`

7. No credentials (public access only)

Set these before running the MCP server:

bash
# For SciToken
export SCITOKEN_FILE=/path/to/your/scitoken

# OR for X.509 certificate
export X509_USER_CERT=/path/to/usercert.pem
export X509_USER_KEY=/path/to/userkey.pem

# OR for proxy file
export X509_USER_PROXY=/tmp/x509up_u${UID}

Option 2: Modify the Service Code

Edit `src/gw_mcp_server/services/gracedb_service.py`:

python
# For X.509 cert/key pair:
self._client = GraceDb(
    cred=('/path/to/cert.pem', '/path/to/key.pem')
)

# For combined proxy file:
self._client = GraceDb(
    cred='/path/to/proxy.pem'
)

# To explicitly use only SciToken:
self._client = GraceDb(use_auth='scitoken')

# To explicitly use only X.509:
self._client = GraceDb(use_auth='x509')

Option 3: Force Public Access Only

If you want to explicitly disable authentication attempts:

python
self._client = GraceDb(force_noauth=True)

Getting Credentials

1. ligo-proxy-init: Run `ligo-proxy-init` to create a short-lived proxy from your certificate

2. htgettoken: Use `htgettoken` to obtain a SciToken

3. CILogon: Get certificates from https://cilogon.org

Test Your Authentication

python
from ligo.gracedb.rest import GraceDb

client = GraceDb()
client.show_credentials()  # Prints auth type and info

# Test access to current run superevents
try:
    for se in client.superevents('category: Production', max_results=5):
        print(se['superevent_id'])
except Exception as e:
    print(f"Auth required: {e}")

Useful GraceDb Client Options

python
GraceDb(
    service_url='https://gracedb.ligo.org/api/',  # Production server
    # service_url='https://gracedb-playground.ligo.org/api/',  # Test server
    cred=None,                    # Path to credentials
    force_noauth=False,           # Skip credential lookup
    fail_if_noauth=False,         # Fail if no credentials found
    reload_cred=False,            # Auto-reload expiring credentials
    reload_buffer=300,            # Seconds before expiry to reload
    use_auth='all',               # 'all', 'scitoken', or 'x509'
    retries=5,                    # Max retries on server error
)

For full documentation: https://ligo-gracedb.readthedocs.io/en/latest/


Data Sources

SourceURLAuth Required
GWOSChttps://gwosc.orgNo
GraceDBhttps://gracedb.ligo.orgFor current run
GCNhttps://gcn.nasa.govYes (Earthdata)

Citation

If you use this software in your research, please cite:

bibtex
@software{gw_mcp,
  title={GW MCP Server: Gravitational Wave Data Access for AI Agents},
  author={Adam Zacharia Anil},
  year={2025},
  url={https://github.com/adamzacharia/GW_MCP}
}

License

MIT

Frequently asked questions

What is GW_MCP?

GW_MCP is An MCP (Model Context Protocol) server providing tools to query Gravitational Wave (GW) data from GraceDB and GWOSC.

How do I install GW_MCP?

Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.

Is GW_MCP open source?

Yes — it is hosted on GitHub at https://github.com/adamzacharia/GW_MCP and has 2 stars.

Related MCP tools

Run your own MCP server? See who uses it and what to fix.

Measure it with TrackMCP