Koskamo

Sugra MCP

Connects AI agents to Sugra Data, providing access to 1,600+ endpoints across 36 domains including markets, macro, news, and research. It allows agents to search, describe, and call data endpoints as native tools, with source and date citations.

Endpoint and access

OAuth sign-in: the first time you connect, your client opens the vendor's own authorization prompt in a browser.

Sugra MCP logo, by Sugra SystemsVendor evidenceStreamable HTTPOAuth sign-inEndpoint checked 2026-11-07Operated by Sugra Systems
You need:Get API key
MCP endpoint (Streamable HTTP)
https://mcp.sugra.ai/mcp
Vendor documentation

What its tools do

11 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

11 of 11 have a description · 11 of 11 declare behavior hints · 6 of 9 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to sugra.ai ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search and call market data endpoints
  • Retrieve macroeconomic indicators
  • Access news and research data
  • Perform entity resolution and screening

Source and maintenance

Vendor evidenceRegistry 0.14.1
Maintenance checked

Protocol and capabilities

Server
sugra-api 0.14.1
MCP protocol negotiated in check
2025-11-25
Tools
11 advertised
Resources
8 advertised
Resource templates
Sign-in required
Prompts
6 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  },
  "experimental": {}
}

Server-provided instructions

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

Sugra MCP - read-only Sugra Data across markets, macro, entities, news, network and earth. Each listed tool's description says what it returns, and its input schema describes each input it takes. list_toolsets and list_sources show the areas of the catalog behind them.

Tools

11 advertised

sugra_entity_screen
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Screen a person or organization name against the Sugra sanctions corpus. Returns a SCREENING SIGNAL, not a compliance determination. Sugra is a technology provider, not a sanctions authority or consumer reporting agency. PEP and adverse-media coverage is supplementary and non-comprehensive - a `clear` result is not proof of absence, and a `hit` is a candidate match to review, not a finding. Output is COMPACT to protect the agent context budget: `{status, matches:[{name, score, list, type}], disclaimer}`. The verdict `status` is one of `clear`, `review`, or `hit`. The heavy raw fields (match rationale, source ids, publish dates) are dropped; use the Sugra API directly when the full screening envelope is needed. Args: name: The person or organization name to screen (required). country: Optional ISO 3166-1 alpha-2 country to narrow the match. dob: Optional date of birth (YYYY-MM-DD) for a person. nationality: Optional nationality to narrow the match.

sugra_entity_screen input schema
{
  "type": "object",
  "title": "sugra_entity_screenArguments",
  "required": [
    "name"
  ],
  "properties": {
    "dob": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Dob",
      "default": null,
      "description": "Optional date of birth for a person, YYYY-MM-DD."
    },
    "name": {
      "type": "string",
      "title": "Name",
      "description": "Person or organization name to screen (required)."
    },
    "country": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Country",
      "default": null,
      "description": "Optional ISO 3166-1 alpha-2 country to narrow the match."
    },
    "nationality": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Nationality",
      "default": null,
      "description": "Optional nationality to narrow the match."
    }
  }
}
sugra_entity_screen output schema
{
  "type": "object",
  "title": "sugra_entity_screenDictOutput",
  "additionalProperties": true
}
sugra_entity_screen annotations
{
  "title": "Sugra Entity screen",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
sugra_entity_lookup
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Resolve an entity by identifier and return its composed KYB envelope. `anchor` is `lei` (Legal Entity Identifier, resolved via the GLEIF registry) or `vat` (EU VAT number, validated via the EU VIES service). The result weaves identity, a sanctions screening signal, and - on request - ownership and adverse-media slices. The screening verdict is a SCREENING SIGNAL, not a compliance determination, and any PEP / adverse-media content is supplementary and non-comprehensive. The `disclaimer` field carries this and is always present. Output is COMPACT by default to protect the agent context budget: `{entity:{name, anchor, value, status, country}, screening:{status, top_matches:[...3], hit_count}, ids:{...}, disclaimer}`. Pass `include` to opt INTO fuller per-slice detail, e.g. `include=["ownership","adverse_media"]` adds those slices in full form. On a bad anchor or an API error this returns a clean `{error, detail}` dict rather than raising, so the agent can branch on `result.get("error")`. Args: anchor: Identifier type, one of `lei` or `vat`. value: The identifier value (the 20-char LEI code or the VAT number). include: Optional list of fuller slices to add, e.g. `["ownership", "adverse_media"]`. Omit for the compact default.

sugra_entity_lookup input schema
{
  "type": "object",
  "title": "sugra_entity_lookupArguments",
  "required": [
    "anchor",
    "value"
  ],
  "properties": {
    "value": {
      "type": "string",
      "title": "Value",
      "description": "The identifier value: 20-character LEI or the VAT number."
    },
    "anchor": {
      "enum": [
        "lei",
        "vat"
      ],
      "type": "string",
      "title": "Anchor",
      "description": "Identifier type: lei (GLEIF) or vat (EU VIES)."
    },
    "include": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Include",
      "default": null,
      "description": "Optional fuller slices to add, e.g. ownership, adverse_media. Omit for the compact default. profile and screening are already in the compact core and are not extra slices."
    }
  }
}
sugra_entity_lookup output schema
{
  "type": "object",
  "title": "sugra_entity_lookupDictOutput",
  "additionalProperties": true
}
sugra_entity_lookup annotations
{
  "title": "Sugra Entity lookup",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
search_endpoints
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search the bundled Sugra endpoint catalog by natural-language query. Use this to pick an operation_id. It does not fetch data. Typical loop: 1. search_endpoints(query) -> ranked hits with required_parameters 2. describe_endpoint(operation_id) -> params, request_body_schema, agent_hints 3. call_endpoint(operation_id, params=..., body=...) or fetch_data(query, params=...) Filter with toolset or source only after list_toolsets / list_sources; a misspelled filter is an error, not a silent empty result. Examples: - search_endpoints("US CPI inflation") - search_endpoints("AAPL price", toolset="markets") - search_endpoints("container ship AIS", toolset="network")

search_endpoints input schema
{
  "type": "object",
  "title": "search_endpointsArguments",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 10,
      "description": "Maximum ranked hits to return. Default 10. Does not call the Sugra API; this only bounds the catalog search list."
    },
    "query": {
      "type": "string",
      "title": "Query",
      "description": "Natural-language search over the bundled catalog. Name the instrument, series, place, or task (examples: 'US CPI', 'AAPL quote', 'North Sea AIS'). Returns ranked operation_id hits with required_parameters. Then call describe_endpoint on a hit before call_endpoint."
    },
    "source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Source",
      "default": null,
      "description": "Optional source-family filter as listed by list_sources (macro, markets, ...). An unknown value returns error unknown_source with known_sources."
    },
    "toolset": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Toolset",
      "default": null,
      "description": "Optional catalog group filter (markets, macro, news, network, ...). Call list_toolsets for the live names. An unknown value returns error unknown_toolset with known_toolsets rather than an empty hit list."
    }
  }
}
search_endpoints output schema
{
  "type": "object",
  "title": "search_endpointsDictOutput",
  "additionalProperties": true
}
search_endpoints annotations
{
  "title": "Search endpoints",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
describe_endpoint
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Describe one Sugra API endpoint by operation_id. Includes agent_hints (duration_class fast/slow/heavy, max_concurrency, bulk billing) so you can budget timeouts and parallelism before calling. POST endpoints with a JSON body also carry request_body_schema (the resolved JSON schema) - construct the `body` argument from it instead of guessing key names. Call this after search_endpoints and before call_endpoint when you need the exact parameter names and examples.

describe_endpoint input schema
{
  "type": "object",
  "title": "describe_endpointArguments",
  "required": [
    "operation_id"
  ],
  "properties": {
    "operation_id": {
      "type": "string",
      "title": "Operation Id",
      "description": "Catalog operation_id from search_endpoints (or from list_toolsets drill-down). Unknown ids return error unknown_operation_id."
    }
  }
}
describe_endpoint output schema
{
  "type": "object",
  "title": "describe_endpointDictOutput",
  "additionalProperties": true
}
describe_endpoint annotations
{
  "title": "Describe endpoint",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
call_endpoint
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Call a Sugra API endpoint by operation_id from the bundled catalog. Plan calls with describe_endpoint's agent_hints: duration_class "fast" usually responds in under ~2s, "slow" usually 1-5s and occasionally 15s+ on a cold upstream, "heavy" can exceed the gateway timeout - keep parallel calls within max_concurrency and prefer small batches. Bulk endpoints bill 1 request credit per body item. Failures return structured errors {error, reason, status_code, elapsed_ms, retry_hint}; after "upstream_timeout" a single retry often succeeds because the aborted attempt warms upstream caches.

call_endpoint input schema
{
  "type": "object",
  "title": "call_endpointArguments",
  "required": [
    "operation_id"
  ],
  "properties": {
    "body": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": true
        },
        {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Body",
      "default": null,
      "description": "JSON request body for a POST operation, matching the request_body_schema returned by describe_endpoint(operation_id): a JSON object for most operations, or a JSON array when that schema's top-level type is array. Omit for GET operations."
    },
    "limit": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Limit",
      "default": null,
      "description": "Bounds ONLY the records list: the data list, a bare top-level array, or the list inside an object data when exactly one of these keys holds a list: data, entries, events, history, items, observations, points, records, results, rows, series, timeseries (for example data.items). When data has no such single list but every one of its values is an object holding exactly one list named observations, limit bounds each data.<key>.observations list on its own (records_path data.*.observations); fields there still names keys of data. Otherwise, no such list, or several, means the limit does not apply. Keys beside the list such as total and count are not rewritten, and lists nested inside records are never truncated. limit keeps the newest N records when every record carries one date or period key in one format and the list runs one way by it, else the first N, and meta.shaped reports limit_applied, records_path and, for a bounded records list, order (asc, desc or unknown) and kept_end (newest or first), as maps by name for sibling sub-series."
    },
    "fields": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Fields",
      "default": null,
      "description": "Optional projection of keys to keep on each record of the records list: the data list, a bare top-level array, or the list inside an object data when exactly one of these keys holds a list: data, entries, events, history, items, observations, points, records, results, rows, series, timeseries (for example data.items). Keys beside that list such as total and count stay. If a field names a key of data itself, or of a payload without data, that object is projected instead; an object data without such a list is otherwise kept whole. Dotted paths (geo.city) walk nested objects. If no field matches, nothing is removed. meta.shaped reports fields_applied, fields_unmatched and records_path. Omit to keep every key."
    },
    "params": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ],
      "title": "Params",
      "default": null,
      "description": "Query and path parameters for this operation_id. Keys and types are operation-specific - call describe_endpoint(operation_id) first to get the exact parameter names, types, and examples. Omit if the operation takes none. A key the operation does not declare returns error unknown_parameters with the accepted names and did_you_mean, before any request is made."
    },
    "include_raw": {
      "type": "boolean",
      "title": "Include Raw",
      "default": false,
      "description": "If true, attach the original unshaped payload under raw when it fits the size cap; otherwise meta.raw_omitted explains why. Default false."
    },
    "operation_id": {
      "type": "string",
      "title": "Operation Id",
      "description": "Catalog operation_id to call, from search_endpoints (or from list_toolsets drill-down). Call describe_endpoint on it first for the parameter names. Unknown ids return error unknown_operation_id before any request is made."
    }
  }
}
call_endpoint output schema
{
  "type": "object",
  "title": "call_endpointDictOutput",
  "additionalProperties": true
}
call_endpoint annotations
{
  "title": "Call endpoint",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_toolsets
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List catalog groups with endpoint counts and short descriptions. Use the group names as the toolset filter on search_endpoints. This does not call the Sugra API; it reads the bundled catalog.

list_toolsets input schema
{
  "type": "object",
  "title": "list_toolsetsArguments",
  "properties": {}
}
list_toolsets output schema
{
  "type": "object",
  "title": "list_toolsetsDictOutput",
  "additionalProperties": true
}
list_toolsets annotations
{
  "title": "List toolsets",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
fetch_data
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One-step fetch: find the best Sugra endpoint for the query and call it. Combines search_endpoints + call_endpoint into a single round trip. Use this when you want data without manually picking an operation_id. The full search_endpoints + describe_endpoint + call_endpoint dance is still available when you need explicit control, but for most natural-language queries this tool is enough. Behavior: 1. Search the bundled catalog for the query. Top match wins. 2. If the matched endpoint has required parameters and they are all provided in `params`, call it and return the response. 3. If required parameters are missing, return the candidate endpoints and the missing-params list so the LLM can retry with the correct `params` dict on the next call. 4. If the query names a country and the match takes a `country` or `countries` param that `params` leaves unset, return needs_params for it with query_countries (ISO2) instead of running the match without that filter. Examples: - `fetch_data("US CPI inflation", params={"series_id": "CPIAUCSL"})` runs fred_series_series_id (/api/v1/fred/series/CPIAUCSL) and returns observations. - `fetch_data("Bitcoin price")` runs onchain_bitcoin_price, which takes no params. - `fetch_data("Latest financial news")` runs news_latest, which has no required params. Only the top match runs, and a param it does not declare returns error unknown_parameters. For one coin's price, name the operation: `call_endpoint("crypto_coin_id_price", params={"coin_id": "bitcoin"})`.

fetch_data input schema
{
  "type": "object",
  "title": "fetch_dataArguments",
  "required": [
    "query"
  ],
  "properties": {
    "body": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": true
        },
        {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": true
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Body",
      "default": null,
      "description": "JSON body for an auto-selected POST operation; the tool returns the request_body_schema to fill when the match needs one. Pass a JSON object or a JSON array as that schema's top-level type dictates."
    },
    "limit": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Limit",
      "default": null,
      "description": "Bounds ONLY the records list: the data list, a bare top-level array, or the list inside an object data when exactly one of these keys holds a list: data, entries, events, history, items, observations, points, records, results, rows, series, timeseries (for example data.items). When data has no such single list but every one of its values is an object holding exactly one list named observations, limit bounds each data.<key>.observations list on its own (records_path data.*.observations); fields there still names keys of data. Otherwise, no such list, or several, means the limit does not apply. Keys beside the list such as total and count are not rewritten, and lists nested inside records are never truncated. limit keeps the newest N records when every record carries one date or period key in one format and the list runs one way by it, else the first N, and meta.shaped reports limit_applied, records_path and, for a bounded records list, order (asc, desc or unknown) and kept_end (newest or first), as maps by name for sibling sub-series."
    },
    "query": {
      "type": "string",
      "title": "Query",
      "description": "Natural-language request for data (examples: 'US CPI', 'Bitcoin price', 'latest news'). The tool picks the top catalog match and calls it. If required params are missing it returns needs_params instead of guessing."
    },
    "fields": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Fields",
      "default": null,
      "description": "Optional projection of keys to keep on each record of the records list: the data list, a bare top-level array, or the list inside an object data when exactly one of these keys holds a list: data, entries, events, history, items, observations, points, records, results, rows, series, timeseries (for example data.items). Keys beside that list such as total and count stay. If a field names a key of data itself, or of a payload without data, that object is projected instead; an object data without such a list is otherwise kept whole. Dotted paths (geo.city) walk nested objects. If no field matches, nothing is removed. meta.shaped reports fields_applied, fields_unmatched and records_path. Omit to keep every key."
    },
    "params": {
      "anyOf": [
        {
          "type": "object",
          "additionalProperties": true
        },
        {
          "type": "null"
        }
      ],
      "title": "Params",
      "default": null,
      "description": "Parameters for the auto-selected endpoint. If omitted and the best-match endpoint has required parameters, the tool returns that endpoint's required_parameters and examples so you can retry with them filled in."
    },
    "include_raw": {
      "type": "boolean",
      "title": "Include Raw",
      "default": false,
      "description": "If true, attach the original unshaped payload under raw when it fits the size cap; otherwise meta.raw_omitted explains why. Default false."
    }
  }
}
fetch_data output schema
{
  "type": "object",
  "title": "fetch_dataDictOutput",
  "additionalProperties": true
}
fetch_data annotations
{
  "title": "Fetch data",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
list_sources
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

List source families in the bundled catalog with endpoint counts. Use the family names as the source filter on search_endpoints. This does not call the Sugra API.

list_sources input schema
{
  "type": "object",
  "title": "list_sourcesArguments",
  "properties": {}
}
list_sources output schema
{
  "type": "object",
  "title": "list_sourcesDictOutput",
  "additionalProperties": true
}
list_sources annotations
{
  "title": "List sources",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
resolve_entity
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Resolve free text to a canonical market or macro entity. Turns a ticker, company name, macro indicator, coin, or currency pair into the agent plane's ``{namespace, ids}`` entity for use with get_snapshot and get_timeseries. A cross-namespace collision (e.g. a ticker that is both an equity and a coin) returns status "ambiguous" with ranked candidates and NEVER silently picks one; pass type_hint (e.g. "equity", "etf", "coin") to narrow the universe. Crypto aliases resolve too (e.g. "bitcoin" -> the BTC coin entity). Status "low_confidence" means the best match cleared resolution but scored weakly - verify the returned entity before building on it, or re-query with a more specific name or type_hint. For compliance KYB lookups by LEI/VAT or sanctions screening use sugra_entity_lookup / sugra_entity_screen instead - this tool is for market-data entities. Args: query: Free-form text - ticker, company, indicator, coin, or pair. type_hint: Optional namespace hint narrowing resolution.

resolve_entity input schema
{
  "type": "object",
  "title": "resolve_entityArguments",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string",
      "title": "Query"
    },
    "type_hint": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Type Hint",
      "default": null
    }
  }
}
resolve_entity output schema
{
  "type": "object",
  "title": "resolve_entityDictOutput",
  "additionalProperties": true
}
resolve_entity annotations
{
  "title": "Resolve entity",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_snapshot
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Composed current view of an entity via a named recipe. Executes a fixed server-side recipe (company_snapshot, etf_snapshot, quote_snapshot, macro_indicator_snapshot, macro_calendar, earnings_snapshot, debt_snapshot) and returns one envelope with freshness, provenance, per-component coverage, and billing. Composed calls charge the recipe's fixed cost (1-2 units) from the daily quota. status "partial" means an optional component was unavailable - the present components are still trustworthy; honor the freshness block (stale=true means the data aged past its budget); for macro_calendar, entity is accepted but does not filter the calendar. Args: recipe: Recipe name from the fixed manifest. entity: Entity dict from resolve_entity ({"namespace": ..., "ids": ...}).

get_snapshot input schema
{
  "type": "object",
  "title": "get_snapshotArguments",
  "required": [
    "recipe",
    "entity"
  ],
  "properties": {
    "entity": {
      "type": "object",
      "required": [
        "namespace",
        "ids"
      ],
      "properties": {
        "ids": {
          "type": "object",
          "description": "Identifier map from resolve_entity.",
          "additionalProperties": true
        },
        "namespace": {
          "type": "string",
          "description": "Entity namespace from resolve_entity."
        }
      },
      "description": "Entity dict from resolve_entity ({namespace, ids}). Extra keys are ignored.",
      "additionalProperties": true
    },
    "recipe": {
      "type": "string",
      "title": "Recipe"
    }
  }
}
get_snapshot output schema
{
  "type": "object",
  "title": "get_snapshotDictOutput",
  "additionalProperties": true
}
get_snapshot annotations
{
  "title": "Get snapshot",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_timeseries
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Bounded timeseries for an entity: price, macro_series, etf_flows or etf_monthly_flows. Returns points oldest-first with an explicit downsampling flag when the raw series exceeded max_points. Times are UTC. Costs 1 unit per call. Read the step from ``served_granularity``, not ``granularity``. The latter echoes the request; the former is the step the source built the points at, and the two can differ (a long price range can come back as monthly bars under a "1d" request). It reads ``mixed`` when the points do not share one step, ``unknown`` when the source does not say, and null when no point came back. It describes how each point was built, not how far apart the returned points are: a thinned daily series still reads ``1d``, and ``downsampled`` is what says points were dropped. The two ETF flow metrics answer different questions and are not interchangeable. ``etf_flows`` is an ESTIMATE at filing cadence: one point per SEC filing refresh, so ``t`` is a filing date and even a wide window yields a handful of points. ``etf_monthly_flows`` is the fund's own creations and redemptions from its NPORT-P filing, so ``t`` is a calendar month (``YYYY-MM``) and each point carries the three filed components - sales, reinvestment, redemption - beside the net. Two things to read before quoting etf_monthly_flows. NPORT-P is filed per SERIES, so for a fund with more than one share class the figures cover every class and the payload says so in ``multi_class_series``; where the class count is unknown it says ``class_scope`` instead of staying silent. And a fund that files no NPORT-P at all, such as a commodity trust, is not an error: the call returns status ``partial`` with an empty point list and a ``reason``. Args: metric: One of price / macro_series / etf_flows / etf_monthly_flows. entity: Entity dict from resolve_entity ({"namespace": ..., "ids": ...}). granularity: Requested point granularity (default "1d"). max_points: Hard cap on returned points (default 500).

get_timeseries input schema
{
  "type": "object",
  "title": "get_timeseriesArguments",
  "required": [
    "metric",
    "entity"
  ],
  "properties": {
    "entity": {
      "type": "object",
      "required": [
        "namespace",
        "ids"
      ],
      "properties": {
        "ids": {
          "type": "object",
          "description": "Identifier map from resolve_entity.",
          "additionalProperties": true
        },
        "namespace": {
          "type": "string",
          "description": "Entity namespace from resolve_entity."
        }
      },
      "description": "Entity dict from resolve_entity ({namespace, ids}). Extra keys are ignored.",
      "additionalProperties": true
    },
    "metric": {
      "enum": [
        "price",
        "macro_series",
        "etf_flows",
        "etf_monthly_flows"
      ],
      "type": "string",
      "title": "Metric"
    },
    "max_points": {
      "type": "integer",
      "title": "Max Points",
      "default": 500
    },
    "granularity": {
      "type": "string",
      "title": "Granularity",
      "default": "1d"
    }
  }
}
get_timeseries output schema
{
  "type": "object",
  "title": "get_timeseriesDictOutput",
  "additionalProperties": true
}
get_timeseries annotations
{
  "title": "Get timeseries",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

6 advertised

market_snapshot — Market snapshot

Advertised by the server during the last successful anonymous check.

Build a sourced price and profile snapshot for one ticker symbol.

symbol
No description (required)
macro_briefing — Macro briefing

Advertised by the server during the last successful anonymous check.

Brief the key macro indicators for a country from sovereign sources.

country
No description (required)
sanctions_screening — Sanctions screening

Advertised by the server during the last successful anonymous check.

Screen a name against the sanctions corpus and report the signal.

name
No description (required)
sector_compare — Sector compare

Advertised by the server during the last successful anonymous check.

Compare two sectors through ETF and valuation endpoints.

sector_a
No description (required)
sector_b
No description (required)
earth_conditions — Earth conditions

Advertised by the server during the last successful anonymous check.

Report weather, air quality, and nearby hazards for a coordinate.

lat
No description (required)
lon
No description (required)
source_overview — Source overview

Advertised by the server during the last successful anonymous check.

Explain what the catalog offers for a data domain, sources included.

domain
No description (required)

Resources

8 advertised

catalog_domains — Catalog domains

Advertised by the server during the last successful anonymous check.

Endpoint groups (toolsets) in the bundled Sugra catalog: name, description, and endpoint count per group. Same data as the list_toolsets tool.

catalog_domains URI
sugra://catalog/domains

MIME type: application/json

catalog_sources — Catalog sources

Advertised by the server during the last successful anonymous check.

Source families in the bundled Sugra catalog with endpoint counts per family. Same data as the list_sources tool.

catalog_sources URI
sugra://catalog/sources

MIME type: application/json

attribution — Source attribution

Advertised by the server during the last successful anonymous check.

How Sugra names data sources, where per-call attribution metadata appears, and where the full source list is published.

attribution URI
sugra://attribution

MIME type: text/markdown

skill_explore_catalog — Discover and call

Advertised by the server during the last successful anonymous check.

Find the right Sugra operation, call it over HTTPS or MCP, and check that the result answers the question. Use when the path or operation_id is unknown, before guessing parameters, before quoting a figure, or after a catalog miss. Confirm details on https://docs.sugra.ai. Do not invent routes.

skill_explore_catalog URI
sugra://skills/explore-catalog

MIME type: text/markdown

skill_envelope_attribution — Envelope and attribution

Advertised by the server during the last successful anonymous check.

Parse Sugra API payloads over HTTPS or MCP, keep source attribution, and tell observation time from request time. Use when reading a response, citing a figure, or shaping a large payload.

skill_envelope_attribution URI
sugra://skills/envelope-attribution

MIME type: text/markdown

skill_auth_limits — Auth and quota

Advertised by the server during the last successful anonymous check.

Authenticate to Sugra over HTTPS and MCP, stay inside the daily quota, and act on each error. Use when setting up a client, before a bulk call, or when a call returns 400, 401, 404, 422, 429, 5xx, missing_api_key, missing_bearer_token, unknown_parameters, needs_params, or upstream_*.

skill_auth_limits URI
sugra://skills/auth-limits

MIME type: text/markdown

skill_hosted_vs_gateway — Connect

Advertised by the server during the last successful anonymous check.

Attach a client to Sugra over HTTPS or MCP and install these skills. Use when setting up Claude (claude.ai, Desktop, Code), ChatGPT, Codex, Cursor, VS Code, Gemini CLI, Grok, OpenBB, a custom HTTP agent, or self-hosted MCP.

skill_hosted_vs_gateway URI
sugra://skills/hosted-vs-gateway

MIME type: text/markdown

skill_cross_domain_briefing — Cross-domain briefing

Advertised by the server during the last successful anonymous check.

Compose one briefing from two or three Sugra directions over HTTPS or MCP. Use when a question spans Finance, Macro, Entity, Net Atlas, News, Earth, or Research and one operation is not enough.

skill_cross_domain_briefing URI
sugra://skills/cross-domain-briefing

MIME type: text/markdown

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

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
732 ms
95th percentile latency
732 ms

Maintenance history

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

  • · probe · passed · 732 ms · metadata changed · refuses unauthenticated resources/templates/list (HTTP 401)

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 sugra-mcp https://mcp.sugra.ai/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 sugra-mcp --url https://mcp.sugra.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable sugra-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "sugra-mcp": {
      "url": "https://mcp.sugra.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "sugra-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.sugra.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start sugra-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "sugra-mcp": {
      "type": "http",
      "url": "https://mcp.sugra.ai/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 sugra-mcp https://mcp.sugra.ai/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.sugra.ai/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": {
    "sugra-mcp": {
      "serverUrl": "https://mcp.sugra.ai/mcp"
    }
  }
}

Let your agent find its tools

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

Do you run Sugra MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing