Koskamo

Signal Lab MCP

An MCP server that indexes 95 free and free-to-start data sources across financial markets, global macro, weather, news, and OSINT. It allows AI agents to search, compare, and export catalog entries and source URLs without requiring authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Signal Lab MCP logo, by Signal LabCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Signal Lab
MCP endpoint (Streamable HTTP)
https://signal-lab-jet.vercel.app/api/mcp
Vendor documentation

What you can do with it

  • Search for free financial and weather datasets
  • Export catalog entries and source URLs
  • Compare data sources and filters
  • Ingest data using provided skills

Source and maintenance

Community listingRegistry 1.3.0

Protocol and capabilities

Server
signal-lab-catalog 1.3.0
MCP protocol
2025-06-18
Tools
8 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Information presented for educational purposes only. Free tiers, limits, and licenses belong to the providers and may change. Users must verify and follow each provider's terms.

Tools

8 advertised

search_catalog — Search the catalog
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find free and free-to-start data sources (financial markets, global macro, weather, news & RSS, OSINT), tools and models in the Signal Lab catalog by text and by filters (domain, category, type, access badge, sign-up needed, license, task, verified, verified_since; see list_filters for the values). Returns up to 25 summary rows in name order, each with lastVerified and sitePageUrl. Use get_entry for every field of one entry, export_catalog for the whole list, get_source_urls for provider and terms links.

search_catalog input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "auth": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "What sign-up is needed, as the catalog records it, for example none or free API key"
    },
    "task": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "One task tag, for example macro or market-data"
    },
    "type": {
      "enum": [
        "Dataset",
        "Model",
        "Recipe",
        "Starter Kit",
        "Tool"
      ],
      "type": "string",
      "description": "Kind of entry, for example Dataset or Tool"
    },
    "badge": {
      "enum": [
        "Free",
        "Freemium",
        "Open Source",
        "Unofficial"
      ],
      "type": "string",
      "description": "Access type: Free, Open Source, Freemium or Unofficial"
    },
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "Default 10, at most 25"
    },
    "query": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Words that must all appear in the name, slug, category, domain, coverage, license, license note or tasks"
    },
    "domain": {
      "enum": [
        "Financial",
        "Global Macro",
        "Weather",
        "News & RSS",
        "OSINT"
      ],
      "type": "string",
      "description": "Data domain: Financial, Global Macro, Weather, News & RSS or OSINT"
    },
    "license": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "The catalog's license value, for example Provider terms or MIT"
    },
    "category": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "The catalog's category, for example Market Data or Macro"
    },
    "verified": {
      "type": "boolean",
      "description": "true: only entries counted as Verified resources in llms.txt; false: only the others (Signal Lab originals, license unknown)"
    },
    "verified_since": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Only entries whose lastVerified date is on or after this date (YYYY-MM-DD)"
    }
  }
}
search_catalog annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_entry — Get one entry
Advertised by the server during the last successful anonymous check.
Advertised read-only

Return one catalog entry by slug, with every field the catalog has for it (limits, coverage, auth, license, licenseNote, source URLs, lastVerified). Get slugs from search_catalog.

get_entry input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1
    }
  }
}
get_entry annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_entries — Compare entries
Advertised by the server during the last successful anonymous check.
Advertised read-only

Place the catalog's fields for up to 5 entries side by side. Values are the catalog's own; a field the catalog does not have shows Not in catalog.

compare_entries input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "slugs"
  ],
  "properties": {
    "slugs": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 80,
        "minLength": 1
      },
      "maxItems": 5,
      "minItems": 1
    }
  }
}
compare_entries annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_filters — List filter values
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the values the catalog uses for type, badge, auth, category, domain, license, task, verified and lastVerified, with how many entries have each. Call this first to pick exact filter values.

list_filters input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
list_filters annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
catalog_info — Catalog information
Advertised by the server during the last successful anonymous check.
Advertised read-only

Return the catalog's notice, schemaVersion, generated time, entry count and the download URLs of the full catalog as JSON and CSV.

catalog_info input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
catalog_info annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
export_catalog — Export the data list
Advertised by the server during the last successful anonymous check.
Advertised read-only

Export the Signal Lab catalog as JSON or CSV: every entry, or only those matching the same filters as search_catalog (no result cap). Optional fields picks columns by catalog field name. CSV has a header row, joins lists with "; " and repeats the catalog notice in the last column. Also returns the static download URLs.

export_catalog input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "auth": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "What sign-up is needed, as the catalog records it, for example none or free API key"
    },
    "task": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "One task tag, for example macro or market-data"
    },
    "type": {
      "enum": [
        "Dataset",
        "Model",
        "Recipe",
        "Starter Kit",
        "Tool"
      ],
      "type": "string",
      "description": "Kind of entry, for example Dataset or Tool"
    },
    "badge": {
      "enum": [
        "Free",
        "Freemium",
        "Open Source",
        "Unofficial"
      ],
      "type": "string",
      "description": "Access type: Free, Open Source, Freemium or Unofficial"
    },
    "query": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Words that must all appear in the name, slug, category, domain, coverage, license, license note or tasks"
    },
    "domain": {
      "enum": [
        "Financial",
        "Global Macro",
        "Weather",
        "News & RSS",
        "OSINT"
      ],
      "type": "string",
      "description": "Data domain: Financial, Global Macro, Weather, News & RSS or OSINT"
    },
    "fields": {
      "type": "array",
      "items": {
        "enum": [
          "name",
          "slug",
          "category",
          "domain",
          "type",
          "sitePageUrl",
          "providerUrl",
          "badge",
          "auth",
          "freeTierLimits",
          "rateLimits",
          "docsUrl",
          "coverage",
          "lastVerified",
          "evidenceUrl",
          "evidenceUrls",
          "attribution",
          "tasks",
          "license",
          "licenseUrl",
          "licenseNote"
        ],
        "type": "string"
      },
      "maxItems": 21,
      "minItems": 1,
      "description": "Catalog field names to include; default all"
    },
    "format": {
      "enum": [
        "json",
        "csv"
      ],
      "type": "string",
      "description": "Default json"
    },
    "license": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "The catalog's license value, for example Provider terms or MIT"
    },
    "category": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "The catalog's category, for example Market Data or Macro"
    },
    "verified": {
      "type": "boolean",
      "description": "true: only entries counted as Verified resources in llms.txt; false: only the others (Signal Lab originals, license unknown)"
    },
    "verified_since": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Only entries whose lastVerified date is on or after this date (YYYY-MM-DD)"
    }
  }
}
export_catalog annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_source_urls — Get original source and terms URLs
Advertised by the server during the last successful anonymous check.
Advertised read-only

Return where each entry's data comes from: the provider's site, docs and evidence pages, the license or terms URL with the license note, and the lastVerified date, plus the Signal Lab page. Pass up to 25 slugs, or the same filters as search_catalog (all entries if none). A URL the catalog does not record is left out.

get_source_urls input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "auth": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "What sign-up is needed, as the catalog records it, for example none or free API key"
    },
    "task": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "One task tag, for example macro or market-data"
    },
    "type": {
      "enum": [
        "Dataset",
        "Model",
        "Recipe",
        "Starter Kit",
        "Tool"
      ],
      "type": "string",
      "description": "Kind of entry, for example Dataset or Tool"
    },
    "badge": {
      "enum": [
        "Free",
        "Freemium",
        "Open Source",
        "Unofficial"
      ],
      "type": "string",
      "description": "Access type: Free, Open Source, Freemium or Unofficial"
    },
    "query": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Words that must all appear in the name, slug, category, domain, coverage, license, license note or tasks"
    },
    "slugs": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 80,
        "minLength": 1
      },
      "maxItems": 25,
      "minItems": 1,
      "description": "Entry slugs; when given, filters are ignored"
    },
    "domain": {
      "enum": [
        "Financial",
        "Global Macro",
        "Weather",
        "News & RSS",
        "OSINT"
      ],
      "type": "string",
      "description": "Data domain: Financial, Global Macro, Weather, News & RSS or OSINT"
    },
    "license": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "The catalog's license value, for example Provider terms or MIT"
    },
    "category": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "The catalog's category, for example Market Data or Macro"
    },
    "verified": {
      "type": "boolean",
      "description": "true: only entries counted as Verified resources in llms.txt; false: only the others (Signal Lab originals, license unknown)"
    },
    "verified_since": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "Only entries whose lastVerified date is on or after this date (YYYY-MM-DD)"
    }
  }
}
get_source_urls annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_ingestion_skill — Get an ingestion skill
Advertised by the server during the last successful anonymous check.
Advertised read-only

Return the agent-ready ingestion skill for one data source as markdown: how to get access, the exact request or download, the response format, a Python snippet that loads it into pandas and writes Parquet (or keeps it in memory where the provider's terms limit storage or leave it unclear), limits, known quirks, terms and attribution, and the provider pages it was written from, with quotes. Call it without a slug to list the sources that have a skill so far.

get_ingestion_skill input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "slug": {
      "type": "string",
      "maxLength": 80,
      "minLength": 1,
      "description": "Entry slug, for example fred or gdelt; leave out to list available skills"
    }
  }
}
get_ingestion_skill annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1220 ms
95th percentile latency
1220 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1220 ms · metadata changed · 8 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http signal-lab-mcp https://signal-lab-jet.vercel.app/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add signal-lab-mcp --url https://signal-lab-jet.vercel.app/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable signal-lab-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "signal-lab-mcp": {
      "url": "https://signal-lab-jet.vercel.app/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "signal-lab-mcp": {
      "type": "streamableHttp",
      "url": "https://signal-lab-jet.vercel.app/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start signal-lab-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "signal-lab-mcp": {
      "type": "http",
      "url": "https://signal-lab-jet.vercel.app/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http signal-lab-mcp https://signal-lab-jet.vercel.app/api/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "signal-lab-mcp": {
      "url": "https://signal-lab-jet.vercel.app/api/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "signal-lab-mcp": {
      "serverUrl": "https://signal-lab-jet.vercel.app/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Signal Lab MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.