Factor exposures and risk contribution for a portfolio, computed on the prices you send.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Creo API key. Optional: without it the SYNTH.* demo tickers still score. Get one free with the mint_api_key tool or at https://itscreo.com/account.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
List factor ids, the daily closes each needs, the demo tickers and the methodology version. Free.
This tool takes no arguments.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http creo https://itscreo.com/mcp
Headers
x-api-key (optional, not in the config above): Creo API key. Optional: without it the SYNTH.* demo tickers still score. Get one free with the mint_api_key tool or at https://itscreo.com/account.List factor ids, the daily closes each needs, the demo tickers and the methodology version. Free.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Create a free API key (100 scoring calls a day, 5 positions). Free; limited to 5 keys per IP per day. The key is shown once. Put it in your MCP client config as the x-api-key header, or pass it as the api_key argument of the scoring tools for the rest of this session.
| Argument | Type | Description |
|---|---|---|
| string |
{
"type": "object",
"properties": {
"email": {
"type": "string"
}
},
"additionalProperties": false
}Score the five labeled SYNTH.* demo tickers. Synthetic series, not market data. Works without a key. Costs 1 credit.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Optional. Your creo_ key, for clients that can't set the x-api-key header after connecting (for example right after mint_api_key). Prefer the header. |
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Optional. Your creo_ key, for clients that can't set the x-api-key header after connecting (for example right after mint_api_key). Prefer the header."
}
},
"additionalProperties": false
}Compute named factor exposures and risk contribution for positions. You must supply daily close history (volume for liquidity, market_cap for size, benchmark for beta). Creo never fetches prices. Missing exposures stay null with a reason. Needs a key unless every position is a SYNTH.* ticker without history. Costs 1 credit when it succeeds; errors are free.
| Argument | Type | Description |
|---|---|---|
| cash | string | number | Cash in USD, part of NAV. |
| api_key | string | Optional. Your creo_ key, for clients that can't set the x-api-key header after connecting (for example right after mint_api_key). Prefer the header. |
| factors | array | Default: all factors for the asset classes present. |
| universe | string | |
| valid_at | string | UTC cutoff ending in Z; later bars are ignored. |
| benchmark | object | Market series for beta, e.g. SPY closes. Without it beta is null with MISSING_BENCHMARK. |
| positions* | array | quantity > 0 is long, < 0 is short. |
{
"type": "object",
"required": [
"positions"
],
"properties": {
"cash": {
"type": [
"string",
"number"
],
"description": "Cash in USD, part of NAV."
},
"api_key": {
"type": "string",
"description": "Optional. Your creo_ key, for clients that can't set the x-api-key header after connecting (for example right after mint_api_key). Prefer the header."
},
"factors": {
"type": "array",
"items": {
"enum": [
"equity.market_beta.ewma.252",
"equity.size.log_mcap",
"equity.momentum.total_return.12_1",
"equity.low_volatility.ewma.63",
"equity.liquidity.amihud.63",
"crypto.market_beta.ewma.180",
"crypto.momentum.total_return.180_30",
"crypto.low_volatility.ewma.30",
"crypto.liquidity.amihud.30",
"equity.value.book_to_price.sec",
"equity.investment.asset_growth.sec",
"equity.quality.gross_profitability.sec",
"equity.quality.return_on_assets.sec"
],
"type": "string"
},
"description": "Default: all factors for the asset classes present."
},
"universe": {
"enum": [
"client_supplied",
"demo_synthetic"
],
"type": "string"
},
"valid_at": {
"type": "string",
"format": "date-time",
"description": "UTC cutoff ending in Z; later bars are ignored."
},
"benchmark": {
"type": "object",
"required": [
"history"
],
"properties": {
"ticker": {
"type": "string"
},
"history": {
"type": "array",
"items": {
"type": "object",
"required": [
"date",
"close"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"description": "YYYY-MM-DD"
},
"close": {
"type": [
"string",
"number"
],
"description": "Close price in USD."
},
"volume": {
"type": [
"string",
"number"
],
"description": "Units traded; needed for liquidity."
}
},
"additionalProperties": false
},
"minItems": 2
}
},
"description": "Market series for beta, e.g. SPY closes. Without it beta is null with MISSING_BENCHMARK.",
"additionalProperties": false
},
"positions": {
"type": "array",
"items": {
"type": "object",
"required": [
"ticker",
"quantity"
],
"properties": {
"close": {
"type": [
"string",
"number"
],
"description": "Valuation close in USD."
},
"ticker": {
"type": "string"
},
"history": {
"type": "array",
"items": {
"type": "object",
"required": [
"date",
"close"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"description": "YYYY-MM-DD"
},
"close": {
"type": [
"string",
"number"
],
"description": "Close price in USD."
},
"volume": {
"type": [
"string",
"number"
],
"description": "Units traded; needed for liquidity."
}
},
"additionalProperties": false
}
},
"quantity": {
"type": [
"string",
"number"
],
"description": "Signed units, non-zero."
},
"market_cap": {
"type": [
"string",
"number"
],
"description": "USD; needed for size."
},
"asset_class": {
"enum": [
"equity",
"crypto"
],
"type": "string"
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "quantity > 0 is long, < 0 is short."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.