Mellow Tapir Radio Spectrum Guide

io.github.guycolePublished by GitHub account guycolev1.0.2Updated Nov 3, 2026

Explore likely radio services, channels, and emissions from 108 MHz to 1 GHz.

The publisher's own server: Mellow Hub

VerifiedSTDIODesktop onlyDatabasesAI & ML

Overview

AI-generated overview

Read-only radio spectrum catalog server that lets an assistant classify frequencies, list channels and search services from 108 MHz to 1 GHz.

What you can do
  • Classify a single frequency into matching bands and known channels, accepting Hz, MHz strings or explicit units
  • List known channels within a frequency range, with labels, services and emissions
  • Search service and use names by text and get range summaries
  • Run ad hoc read-only SQL (SELECT or WITH) over the SQLite catalog, with write operations rejected
  • Query a local Ollama reference model with a prompt, optional system prompt and temperature
  • Read resources exposing catalog metadata and the seed and schema source files
When to use it
Useful when you need to interpret a radio frequency, look up which service or channel occupies a band, or browse the catalog of bands, emissions and channels between 108 MHz and 1 GHz. It suits spectrum planning, monitoring or hobbyist radio questions rather than general web or data work.
Requirements
Runs as a local process (stdio) or as a Docker image with streamable HTTP. Needs a built SQLite catalog generated from the seed JSON and schema SQL, plus the TAPIR_DB_PATH, TAPIR_SEED_PATH and TAPIR_SCHEMA_PATH environment variables. The reference-model tool needs a reachable Ollama endpoint via OLLAMA_BASE_URL and the model named by REFERENCE_LLM_MODEL (default gpt-oss:20b).
Before you install
The catalog is read-only and SQL writes are rejected, but the reference-model tool sends prompts to whatever Ollama endpoint OLLAMA_BASE_URL points at, so keep it on a trusted local host. The README's HTTP example binds to 0.0.0.0, which exposes the server beyond the local machine; prefer 127.0.0.1. Data comes from a checked-in seed file, so results reflect that dataset rather than live spectrum data.

Installation

In SourceWeft

  1. Open Mellow Tapir Radio Spectrum Guide in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Tapir MCP Server

This directory contains an MCP server with both stdio and streamable HTTP transports. The server uses data from src/tapir_schema/seed.json and source schema text from src/tapir_schema/schema.sql, then serves a read-only SQLite catalog.

Python environment

Use the existing local virtual environment:

bash
cd src/tapir_mcp_server./venv/bin/python -m pip install -r requirements.txt

Build the SQLite database

bash
cd /Users/gsc/github/mellow-tapir/src/tapir_mcp_server./venv/bin/python -m mcp_server.build_db \  --db-path data/tapir.sqlite \  --seed-path ../tapir_schema/seed.json \  --schema-path ../tapir_schema/schema.sql

Run in stdio mode

bash
cd /Users/gsc/github/mellow-tapir/src/tapir_mcp_serverTAPIR_DB_PATH=data/tapir.sqlite \TAPIR_SEED_PATH=../tapir_schema/seed.json \TAPIR_SCHEMA_PATH=../tapir_schema/schema.sql \./venv/bin/python -m mcp_server --transport stdio

Run in HTTP mode

bash
cd /Users/gsc/github/mellow-tapir/src/tapir_mcp_serverTAPIR_DB_PATH=data/tapir.sqlite \TAPIR_SEED_PATH=../tapir_schema/seed.json \TAPIR_SCHEMA_PATH=../tapir_schema/schema.sql \REFERENCE_LLM_MODEL=gpt-oss:20b \OLLAMA_BASE_URL=http://127.0.0.1:11434 \./venv/bin/python -m mcp_server \  --transport http --host 0.0.0.0 --port 8000 --path /mcp

Local testing with Ollama gpt-oss:20b

Start Ollama and ensure the reference model is available:

bash
ollama serve

In another terminal:

bash
ollama pull gpt-oss:20bollama run gpt-oss:20b "Summarize the purpose of this MCP server in one sentence."

Run the MCP server with the same local Ollama endpoint:

bash
cd /Users/gsc/github/mellow-tapir/src/tapir_mcp_serverTAPIR_DB_PATH=data/tapir.sqlite \TAPIR_SEED_PATH=../tapir_schema/seed.json \TAPIR_SCHEMA_PATH=../tapir_schema/schema.sql \REFERENCE_LLM_MODEL=gpt-oss:20b \OLLAMA_BASE_URL=http://127.0.0.1:11434 \./venv/bin/python -m mcp_server --transport http --host 127.0.0.1 --port 8000 --path /mcp

When connected with an MCP client, call ask_reference_model with a test prompt. If Ollama is reachable and the model is present, the tool returns a response body and metadata including model and done status.

Sample local MCP session (with Ollama)

This sample session verifies end-to-end behavior:

  1. Build or refresh the SQLite catalog.
  2. Start Ollama and pull gpt-oss:20b.
  3. Start the MCP server over HTTP.
  4. Connect with a client and call tools.

Terminal 1: start Ollama

bash
ollama serve

Terminal 2: pull model and optional sanity prompt

bash
ollama pull gpt-oss:20bollama run gpt-oss:20b "Reply with: Ollama ready"

Terminal 3: start Tapir MCP server

bash
cd /Users/gsc/github/mellow-tapir/src/tapir_mcp_server./venv/bin/python -m mcp_server.build_db \  --db-path data/tapir.sqlite \  --seed-path ../tapir_schema/seed.json \  --schema-path ../tapir_schema/schema.sql
TAPIR_DB_PATH=data/tapir.sqlite \TAPIR_SEED_PATH=../tapir_schema/seed.json \TAPIR_SCHEMA_PATH=../tapir_schema/schema.sql \REFERENCE_LLM_MODEL=gpt-oss:20b \OLLAMA_BASE_URL=http://127.0.0.1:11434 \./venv/bin/python -m mcp_server --transport http --host 127.0.0.1 --port 8000 --path /mcp

Terminal 4: sample client requests

bash
cd /Users/gsc/github/mellow-tapir/Users/gsc/github/mellow-tapir/src/tapir_mcp_server/venv/bin/python - <<'PY'import anyiofrom mcp.client.session import ClientSessionfrom mcp.client.streamable_http import streamable_http_client

async def main() -> None:    async with streamable_http_client("http://127.0.0.1:8000/mcp") as (        read_stream,        write_stream,    ):        session = ClientSession(read_stream, write_stream)        async with session:            await session.initialize()
            classify = await session.call_tool(                "classify_frequency", {"frequency": "121.5"}            )            print("classify_frequency:")            print(classify.content[0].text)
            llm = await session.call_tool(                "ask_reference_model",                {                    "prompt": "Explain 121.5 MHz in one sentence.",                    "temperature": 0.1,                },            )            print("ask_reference_model:")            print(llm.content[0].text)

anyio.run(main)PY

Expected outcome:

  • classify_frequency returns aviation emergency channel data around 121.5 MHz.
  • ask_reference_model returns a completion from local Ollama model gpt-oss:20b.

Available tools

  • classify_frequency
    • Purpose: classify a single frequency into matching bands and exact known channels.
    • Input: frequency as numeric Hz, MHz string (121.5), or explicit unit (121.5MHz).
    • Output: frequency metadata, channel matches, and band matches with emissions.
  • query_channels
    • Purpose: list known channels in a frequency range.
    • Input: lower_hz, upper_hz, optional limit.
    • Output: ordered channel rows with labels, services, and emissions.
  • search_services
    • Purpose: text search across service names and use names.
    • Input: service_query, optional limit.
    • Output: matching service/use combinations with range summaries.
  • execute_readonly_sql
    • Purpose: ad hoc read-only analysis over the SQLite catalog.
    • Input: SQL SELECT or WITH query and optional limit.
    • Output: column list, row list, and row count.
    • Guardrails: write operations are rejected.
  • ask_reference_model
    • Purpose: query local reference LLM through Ollama.
    • Input: prompt, optional system_prompt, optional temperature.
    • Output: model response text and completion metadata.
    • Default model: gpt-oss:20b (override with REFERENCE_LLM_MODEL).

Available resources

  • tapir://metadata
  • tapir://sources/seed-json
  • tapir://sources/schema-sql

Docker

Build locally:

bash
cd /Users/gsc/github/mellow-tapirdocker build -f src/tapir_mcp_server/Dockerfile -t tapir-mcp:local .

Run:

bash
docker run --rm -p 8080:8080 \  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \  tapir-mcp:local

The GitHub Actions workflow in .github/workflows/tapir-mcp-server-image.yml publishes images to GitHub Container Registry.

SQLite data lineage and refresh

The SQLite database in data/tapir.sqlite is generated from two source files:

  • src/tapir_schema/seed.json: canonical editable catalog of bands, emissions, and channels.
  • src/tapir_schema/schema.sql: source PostgreSQL schema retained for provenance and parity checks.

Generation is handled by mcp_server.build_db, which:

  • creates SQLite tables (band, band_emission, channel, dataset_metadata),
  • reloads records from seed.json,
  • stores source provenance metadata (including source paths and schema SQL text),
  • produces a read-ready file used in read-only mode by the MCP server.

When updating the dataset in the future:

  1. Edit src/tapir_schema/seed.json.
  2. Optionally update src/tapir_schema/schema.sql if source-schema intent changed.
  3. Rebuild SQLite:
bash
cd /Users/gsc/github/mellow-tapir/src/tapir_mcp_server./venv/bin/python -m mcp_server.build_db \  --db-path data/tapir.sqlite \  --seed-path ../tapir_schema/seed.json \  --schema-path ../tapir_schema/schema.sql
  1. Restart the MCP server so it uses the refreshed SQLite file.

The container image build also runs this same build step during docker build, so image contents stay aligned with the latest checked-in seed.json and schema.sql.

Source: src/tapir_mcp_server/README.md at commit 629c3be

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v1.0.2LatestSep 22, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other Mellow integrations