Best used with an AI agent

40+ live apps, open data APIs, MCP servers, and 200+ guides - more than anyone wants to click through. Point your AI here and it reads the whole map and does the work: finds the tool, pulls the data, runs the analysis, and hands you the links.

Here for the open-source code? Your agent finds the right repo for you - and can even clone and deploy it.

Prefer to explore on your own? Go right ahead.

Paste this to Claude Code, Codex, or any AI agent:
Go to tigzig.com and read tigzig.com/llms.txt. It is a practitioner toolkit - 40+ analytics apps, open no-auth data APIs, MCP servers, open-source repos (github.com/amararun), and 200+ build guides. Help me [your task]. Surface the exact links; where there is an API or MCP, call it directly; and if I want to self-host, find the repo and help me deploy it.

Tigzig V2 Unified Data Surface (TREMOR) - Macro & Markets Data API

Open, no-auth HTTP API and MCP server for ~330 curated macro, credit, valuation, insurance, India, global, markets and FX indicators across 8 categories, sourced from 17+ publishers (FRED, NY Fed, FDIC, NCUA, RBI, MoSPI, ECB, OECD, Shiller, NSE and more). Category-first navigation built for AI agents first, humans second - every page here has a Copy-as-Markdown button so you can hand it straight to your agent. This is the data behind the TREMOR app.

~330indicators
8categories
17+source publishers
4MCP tools
No authfully open

Overview

AI agents: every endpoint is listed in the machine-readable catalog at api.tigzig.com/.well-known/api-catalog (RFC 9727 linkset), and the V2 surface self-documents at api.tigzig.com/v2/ (version + categories + tool surface + programmatic limits). OpenAPI 3.1 spec at /v2/openapi.json. Start there rather than parsing this page.

Tigzig V2 Unified Data Surface is a single public read-only API that exposes ~330 curated macro, credit, valuation, insurance, India, global, markets and FX indicators across 8 categories, sourced from 17+ publishers. No authentication. It is the same data that backs the TREMOR app.

Two access shapes over the same backend:

  • REST + Swagger at api.tigzig.com/v2/* for any HTTP client.
  • MCP (Streamable HTTP + SSE) at api.tigzig.com/v2/mcp/http and /v2/mcp/sse for AI agent clients (Claude.ai connectors, Cursor, Continue).

Time series come from /v2/series in wide format (one row per date, one column per indicator), JSON or TSV. The TSV body opens with a # meta: count=N unknown=[...] empty=[...] comment line so an agent can tell a typo'd id from an empty date range in the body itself (MCP tool results are body-only - response headers do not reach the agent).

Category-first design

V2 uses progressive disclosure across 4 tools rather than a single flat catalog:

  • list_categories - the 8-category menu (the full list is baked into the tool description, so the agent sees the whole map at session start with no extra round trip).
  • list_indicators_in_category - per-category catalog (with the notes field; ?compact=true returns just id/name/freq/last_date).
  • find_indicator - cross-category fuzzy substring search.
  • v2_get_series - wide-format time series, JSON or TSV (max 10 ids per call).

Compared with a flat-catalog design, this drops MCP session-init token weight from ~7,854 (V1) to ~1,352 (V2), an 83% reduction. The agent reads the 8-category menu at session start, drills into one domain instead of paging through everything, and only loads full per-indicator metadata for the domain it actually cares about.

The notes field (gotchas captured)

Each indicator carries a notes string capturing the agent-relevant sharp edges - annualization recipes, cumulative-vs-per-period semantics, base-year vintages, methodology breaks, sign conventions. 100% coverage: all ~330 visible indicators have notes populated. A few live examples:

Indicatornotes
us_real_gdpUS Real GDP, billions of chained 2017 USD, quarterly SAAR (Seasonally Adjusted ANNUAL Rate). Already annualized - do NOT multiply by 4.
us_yield_curve_10y_2y10Y minus 2Y Treasury spread, percentage points, daily. Negative = inverted = classic recession leading indicator (typically 12-18 months ahead).
in_net_fdiIndia NET Foreign Direct Investment, millions USD, monthly. NEGATIVE = net OUTFLOW. 6+ month publication lag is normal.
in_nifty50_peNifty 50 trailing P/E, daily. METHODOLOGY BREAK: standalone earnings basis pre-April 2021, consolidated thereafter (a structural step in the series).

MCP (for AI agents)

Connect an AI agent (Claude.ai, Cursor, Continue, custom clients) directly and let it discover and pull data on its own. Two transports, both open (no auth):

  • https://api.tigzig.com/v2/mcp/http - Streamable HTTP (recommended for new clients; MCP spec 2025-03-26).
  • https://api.tigzig.com/v2/mcp/sse - SSE (legacy fallback for clients that do not yet speak Streamable HTTP).

The server identifies as Tigzig V2 Unified Data Surface and exposes the four tools above (list_categories, list_indicators_in_category, find_indicator, v2_get_series).

Add to Claude.ai: Settings -> Connectors -> Add custom connector -> paste the Streamable HTTP URL (fall back to SSE if needed) -> approve. The same URLs work for Cursor, Continue, and any MCP client.

Build your own MCP (open-source reference)

The MCP wrapper is a thin shim over the public HTTP API above: four @mcp.tool() functions that call requests.get(), about 60 lines per transport. Use the hosted server above, or run your own.

Reference repo (the actual production wrapper behind api.tigzig.com/v2/): github.com/amararun/tigzig-mcp-v2-reference - shows the 4-tool progressive-disclosure design, YAML catalog as source of truth, menu placement in tool descriptions, the TSV # meta: line, a graceful 429 handler, and the notes field surfaced for sharp edges. MIT licensed.

Self-hosting a public MCP server is your responsibility for security. Some defenses are baked into the reference code (rate limits, allowlist validation, graceful 429), but a publicly exposed endpoint needs more - multi-layer edge rate limiting, abuse detection, secret hygiene, DB hardening. For the full checklist we audit ourselves against, see tigzig.com/security.

Minimal from-scratch version using the official mcp.server.fastmcp SDK (Streamable HTTP transport shown; swap the final mcp.run(...) line for stdio or SSE):

# server.py - Streamable HTTP transport
from mcp.server.fastmcp import FastMCP
import requests

API_BASE = "https://api.tigzig.com/v2"
mcp = FastMCP("Tigzig V2 Unified Data Surface", host="0.0.0.0", port=8000)

@mcp.tool()
def list_categories() -> dict:
    """The 8 V2 categories. Pick one, then list_indicators_in_category."""
    return requests.get(f"{API_BASE}/categories", timeout=30).json()

@mcp.tool()
def list_indicators_in_category(category: str, compact: bool = True) -> dict:
    """Per-category indicator catalog (id, name, frequency, last_date)."""
    params = {"compact": "true"} if compact else {}
    return requests.get(f"{API_BASE}/categories/{category}/indicators", params=params, timeout=30).json()

@mcp.tool()
def find_indicator(query: str, limit: int = 50) -> dict:
    """Cross-category fuzzy substring search on indicator id + name."""
    return requests.get(f"{API_BASE}/find", params={"query": query, "limit": limit}, timeout=30).json()

@mcp.tool()
def v2_get_series(ids: str, from_date: str = "", to_date: str = "") -> dict:
    """Time series for comma-separated ids (max 10), wide format."""
    params = {"ids": ids}
    if from_date: params["from"] = from_date
    if to_date: params["to"] = to_date
    return requests.get(f"{API_BASE}/series", params=params, timeout=60).json()

if __name__ == "__main__":
    mcp.run(transport="streamable-http")  # Endpoint: http://<host>:8000/mcp

For a fuller production example (API-key auth, slowapi rate limits, Pydantic validation, Swagger), see the FastAPI-MCP reference repos: shared-quantstats, shared-fastapi-mcp-ffn, shared-fastapi-database-mcp.

Rate limits

Per IP, published so a well-behaved client can plan around them:

  • Queries (/v2/*): 60 requests / minute.
  • Downloads (/v2/download/*, /v2/downloads/*): 10 requests / minute.
  • Max 10 indicators per /v2/series call; max 10,000 rows per response.

On the limit you get a 429 with Retry-After: 60 and a JSON body naming the limit hit, a recommended retry delay, and a path-aware suggestion (usually: use a bulk download instead of paginating). Honor the header for clean back-off. Programmatic consumers: read the live numbers at api.tigzig.com/v2/ under the limits block instead of hard-coding.

Bulk downloads

For multi-indicator or long-history pulls, use bulk downloads instead of paginating /v2/series - one request, one file:

  • GET /v2/download/all - every public table in one SQLite or DuckDB file.
  • GET /v2/download/{table_name} - one table (macro_indicators, stock_prices, indicator_config) in any of 9 formats (csv / tsv / parquet + .gz + .zip variants + sqlite + duckdb).
  • GET /v2/downloads/manifest - file sizes, row counts, last-refresh timestamps. Iterate this rather than hard-coding filenames.

Files are served via Cloudflare R2 + a streaming Worker (free egress, edge-cached), so big files do not hammer the origin. For a clickable file picker with sizes, use the Bulk Downloads tab in the app.

Indicator dictionary

The full per-indicator dictionary (id, name, category, source, frequency, unit, SA flag, date range, record count, notes) is available two ways:

  • Agents: walk GET /v2/categories/{category}/indicators across the 8 categories, or use GET /v2/find?query=... for a targeted lookup. Both return the notes field.
  • Humans: the Data Dictionary tab in the app is a live, filterable, searchable table of every indicator with its own Copy-as-Markdown.

Endpoints

Generated from the live OpenAPI spec - always in sync with the API. Try them interactively in Swagger.

GET /

V2 catalog - lists every category with a one-liner

V2 catalog entry point. Returns the categories list + tool surface

Examplecurl "https://api.tigzig.com/v2/"
GET /categories

List all V2 categories with one-liner descriptions

Returns the full menu of Tigzig V2 categories with a one-line summary of each. Call this first when you don't know which domain a question lives in. Then call list_indicators_in_category to expand any.

Examplecurl "https://api.tigzig.com/v2/categories"
GET /categories/{category}/indicators

List indicators in a V2 category

Returns metadata for every visible indicator in one Tigzig V2 category.

ParamInTypeDescription
categorypathstringrequired
compactquerybooleanoptionalIf true, return {indicator_id, name, frequency, last_date} only. Lighter payload for big categories.
Examplecurl "https://api.tigzig.com/v2/categories/us_credit/indicators"
GET /download/all

Download ALL Tremor tables in one file (sqlite or duckdb)

Single file with macro_indicators (visible-filtered), stock_prices, and indicator_config (data dictionary). README.md inside the zip.

ParamInTypeDescription
formatquerystringoptionalOne-file-everything format. Choose: sqlite (default, .db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz. CSV/TSV/Parquet are per-table only (use /v2/download/{table_name}).
Examplecurl "https://api.tigzig.com/v2/download/all?format=parquet"
GET /download/{table_name}

Download one Tremor table as a pre-generated file

Available tables (visible-filtered):

ParamInTypeDescription
table_namepathstringrequired
formatquerystringoptionalFile format. Choose: csv (zip), csv.gz, tsv (zip), tsv.gz, parquet (default), sqlite (.db.zip), sqlite.gz, duckdb (.duckdb.zip), duckdb.gz.
Examplecurl "https://api.tigzig.com/v2/download/macro_indicators?format=parquet"
GET /downloads/manifest

Manifest of pre-generated download files (sizes, row counts, generated_at)

Returns the manifest of pre-generated bulk download files. The manifest is the source of truth - iterate over it instead of hard-coding filenames, so future tables auto-appear without breaking client code.

Examplecurl "https://api.tigzig.com/v2/downloads/manifest"
GET /find

Cross-category indicator search by id substring or name

Substring search over indicator IDs and display names across ALL V2 categories. Use this when you know what you want but not which category it lives in (e.g. 'usdinr', 'shiller', 'cape', 'nominal').

ParamInTypeDescription
queryquerystringrequiredSubstring to match against indicator_id or display name.
limitqueryintegeroptionalMax results to return.
Examplecurl "https://api.tigzig.com/v2/find?query=delinq&limit=5"
GET /series

Get time-series data for one or more V2 indicators (wide format)

Returns wide-format time series: one row per date, one column per indicator. Works seamlessly across V2 backends - mix macro indicators and market prices in one call.

ParamInTypeDescription
idsquerystringrequiredComma-separated indicator ids. Max 10.
fromquerystringoptionalYYYY-MM-DD
toquerystringoptionalYYYY-MM-DD
formatquerystringoptionalResponse format: 'json' (default, wide-pivot with meta) or 'tsv' (tab-separated; meta goes into response headers).
Examplecurl "https://api.tigzig.com/v2/series?ids=us_treasury_10y_yield"