MCP App Store
by KeenEthics

Overview

MSCI Connector lets authorized users query entitlement-controlled MSCI index, private capital, portfolio, and real-assets data in natural language, including performance, benchmarks, holdings, exposures, constituents, and methodology insights.

Tools

calculate_metrics

ChatGPT
ENTITLEMENT: this tool enforces the caller's entitlement itself and errors if they lack access. Do NOT call the entitlements tool beforehand to "check access", and do NOT treat an empty entitlements/subscriptions result as a reason to skip this call. Computes metrics for one or more MSCI equity indices via IMX (IndexMetrics), the real-time portfolio analytics engine. IMPORTANT: Supports EQUITY indexes only. For fixed income, hedged, or other non-equity indexes, use fetch_index_data with search_index_datapoints to find the relevant datapoint IDs instead. Prerequisites: call search_index_datapoints to find the metric_mnemonic — use results where source="imx". Call search_index_indexes to resolve index names to msci_index_codes. Pass msci_index_codes or portfolios (with id=msci_index_code from search_index_indexes) — the tool always resolves to IMX portfolio IDs automatically. No GraphQL schema fetch needed for this tool. REQUIRED parameters: - metric_mnemonic: string (single metric, e.g. "index_ratio_price_to_earnings") - msci_index_codes: number[] (array of numeric index codes, e.g. [990100]) - frequency: "daily" | "monthly" - currency: string (e.g. "USD") - variant: "STRD" | "GRTR" | "NETR" (default to "GRTR" unless user specifies) AS-OF-A-DATE RULE (read before choosing range_type): if the user asks for a value "as of <date>" or "on <date>", do NOT use range_type="relative" (always measured back from the LATEST available data, never from a date you supply) or range_type="fixed_start" (open-ended, resolves through LATEST, not through your date) — both silently return the wrong value whenever the requested date is not the most recent one available. Use range_type="fixed" instead, with start_date set to the PRIOR period boundary (see DATE ANCHORING RULE below) and end_date set to the target date, then read the single/last observation. Optional date range (defaults to last 5 years if omitted): - range_type: "fixed" | "fixed_start" | "relative" (default: "relative") - length: number — lookback length for relative range (default: 5) - unit: "day" | "month" | "year" — for relative range (default: "year") - start_date / end_date: YYYY-MM-DD strings for fixed range DATE ANCHORING RULE: start_date is the BASE/ANCHOR DATE, NOT the first observation in the result series. The first OBSERVATION returned is the next period boundary AFTER start_date (next month-end for monthly, next business day for daily). This applies to BOTH return series AND absolute-level series (P/E, P/B, number of constituents, ESG scores, exposures, etc.). For returns the close of start_date is the base; for absolute-level series the value AT a target date D appears as the FIRST observation when you pass the period boundary BEFORE D as start_date (e.g. for monthly P/B at Sep 2023, pass start_date="2023-08-31"). Examples: - YTD return for 2024: start_date="2023-12-29" (last business day of 2023), end_date=<as-of-date> - 1Y return as of 2024-09-30: start_date="2023-09-29" (last business day before 2023-09-30), end_date="2024-09-30" - Since inception from 2020-01-01: start_date="2019-12-31" (prior business day) - Monthly P/B from Sep 2023 through Sep 2024 (absolute levels): start_date="2023-08-31" (PRIOR month-end), end_date="2024-09-30" — the response series begins at 2023-09-29 (Sep 2023 month-end) and ends at 2024-09-30. - Single-date snapshot value (e.g. "P/B at 2024-09-30"): range_type="fixed", start_date=prior business day ("2024-09-27" for a Monday target, or the prior month-end for frequency="monthly"), end_date=2024-09-30 — read the single returned row. NEVER use the target start date itself as start_date — IMX will skip that observation. Pass the PRIOR period boundary so the desired date appears as the first row. TRAILING-WINDOW ANCHOR vs PERIOD-START ANCHOR — do not conflate them; this is the most common start_date mistake for monthly/yearly lookbacks. "N years/months back from <date>" (a trailing lookback ending at an as-of date, e.g. "2-year Sharpe ratio as of 2026-01-30") is NOT a period-start request — start_date is simply <date> minus N years/mon…

create_qis_profile_request

ChatGPT
Creates a new profile from complete OpenAPI ProfileRequest JSON. Use this as the primary profile creation tool, especially for advanced profile features. The AI should construct ProfileRequest using get_qis_reference (topic=schema or topic=examples) and poco:// resources, preserving the user's intent exactly. This tool deserializes to the generated ProfileRequest model, calls validateProfile, and saves only when validation has no failures. Remember the returned profile_id and pass it to later profile tools, the same way job_id is passed to job tools.

execute_index_gql_schema

ChatGPT
Execute a GraphQL request against the schema from getIndexGQLSchema tool call. IMPORTANT: Never fabricate MSCI index codes — always look them up first via an indexSearch query.

fetch_index_data

ChatGPT
ENTITLEMENT: this tool enforces the caller's entitlement itself and returns an entitlement error if they lack access. Do NOT call the entitlements tool beforehand to "check access", and do NOT treat an empty entitlements/subscriptions result as a reason to skip this call. Fetch point-in-time MSCI Index, Constituent, Security, AUM, Dividend, and Corporate Event data for one calc_date. Same input shape and snapping rules as the v1/v2 variant (datapoints + codes + date in YYYYMMDD, optional currency/variant/page/page_size/order_by/order_direction/info_points), with one response shape change: list-cardinality datapoints come back as pandas-friendly tables. TOOL CHOICE: only call this with datapoints whose supports_single_day=true (in search_index_datapoints results). For datapoints with supports_range=true and a question about history / a date range, call fetch_index_timeseries instead. When you request multiple list datapoints from the same parallel response, the sort propagates alignment via the shared key (msci_security_code), so page 1 returns top weights paired with their actual ISINs. Returns { requested_date, fetched_date, note?, scalars, list_tables? }. scalars is {"{index_name} ({code})": { datapoint_id: value }} — same nested shape as v2 fetch_data. list_tables carries one entry per (entity × list datapoint), each with a { columns, rows } table where the first column is date (the same fetched_date value repeated). Pandas: pd.DataFrame(t["rows"], columns=t["columns"]) — identical ingest to the v3 timeseries list_tables so callers can concatenate single-date and range results into one DataFrame. Each list entry also exposes a pagination block (page, page_size, total_rows, total_pages) for clients that need to page through large universes. Errors per-datapoint surface inside scalars[entity][datapoint_id] as { error, hint } objects: SINGLE_DATE_NOT_SUPPORTED, STRICT_GATE_VIOLATION, etc. Do NOT call this in a loop to build a timeseries — use fetch_index_timeseries.

fetch_index_timeseries

ChatGPT
ENTITLEMENT: this tool enforces the caller's entitlement itself and returns an entitlement error if they lack access. Do NOT call the entitlements tool beforehand to "check access", and do NOT treat an empty entitlements/subscriptions result as a reason to skip this call. Fetch a history of MSCI Index, Constituent, Security, AUM, Dividend, and Corporate Event datapoint values over a date range. Use this whenever the user asks for a series, a chart, a return over a period, or "from X to Y". TOOL CHOICE: only call this with datapoints whose supports_range=true (in search_index_datapoints results). For point-in-time questions against datapoints with supports_single_day=true, call fetch_index_data. Inputs: datapoints = IDs from search_index_datapoints where supports_range is true; codes = entity codes matching each datapoint's entity_type; start_date / end_date = YYYYMMDD. Optional: frequency (daily | monthly — month-end-only datapoints are forced to monthly), currency, variant. You may pass multiple datapoints from the SAME dataset in one call (e.g. equity_index.constituents.closing_weight AND equity_index.constituents.identifiers.isin) — they coalesce into a single V1 request and arrive aligned in the same list table. Returns { errors, table, list_tables? }. table is a pandas-friendly JSON table for scalar datapoints: { columns, rows } where columns[0] = "date" (YYYYMMDD) and each subsequent column is "{index_name} ({code}) {datapoint_id}"; missing cells are null. Pandas: pd.DataFrame(t["rows"], columns=t["columns"]). List-cardinality datapoints (constituents, per-security identifiers, weights, etc.) come back in list_tables[] instead — one entry per (entity × datapoint), each carrying its own long-format { columns, rows } with date as the first column. Same pandas idiom applies. Use page / page_size to control per-date pagination, and order_by / order_direction to drive sort order — sorting propagates row alignment across parallel datasets within each date so top weights stay paired with their actual ISINs at every date in the range. errors[] reports per-datapoint issues: RANGE_NOT_SUPPORTED (use fetch_index_data for that one), STRICT_GATE_VIOLATION (variant/currency mismatch — see the datapoint's strict_gate block in search results; switch to the suggested fallback_id), RANGE_WINDOW_VIOLATION (range exceeds V1's frequency-dependent cap), or NOT_FOUND (bad ID). IMPORTANT — no-fallback rule: if this tool returns an empty table (no rows) or an error for the requested period, the history is genuinely unavailable. Do NOT loop fetch_index_data to reconstruct the series. If search_index_datapoints showed constraints.notes about choosing rebalancing calendar dates, anchor start_date/end_date using getIndexDescription (INDEX_MASTER_DESCRIPTION: last_rebalancing_date / next_rebalancing_date) instead of inventing "today".

get_at_pai_date_range

ChatGPT
Get available data date range for an Insights group. NOTE: If you have already called list_at_pai_portfolios, start_date and end_date are already included per portfolio and at the group level in that response — do NOT call this tool in that case. Only call this if you need date range without listing portfolios first.

get_at_pai_risk_report

ChatGPT
Fetch a RAW Factor-Risk or Market-Risk data report for a portfolio (data-only, not a summary). IF THE USER ASKED FOR A SUMMARY, EXPLANATION, OR NARRATIVE of factor risk, do NOT hand-roll one from this — use manage_at_workflow(action='start', name='summarize_risk') (Factor Risk) or manage_at_workflow(action='start', name='summarize_risk_mr') (Market Risk). report_type and portfolio_name are inferred from data_set_id_hash when omitted. Returns a markdown report plus meta. Use search_at_pai_portfolio first; pass hash and measure from the same configuration.

get_at_server_auth

ChatGPT
Return authentication status and user identity if authenticated. Returns: Dictionary with authentication details: - authenticated: True if user has valid JWT - msci_user_id: MSCI user ID from JWT claims - tenants: List of tenant IDs user has access to - workspace_selected: True if user has a workspace selected - workspace_id: Current workspace ID (if selected) If not authenticated, returns authenticated=False with mode indicator.

get_at_server_info

ChatGPT
Return server version and enabled modules.

get_index_dashboard

ChatGPT
ENTITLEMENT: this tool enforces the caller's entitlement itself and errors if they lack access. Do NOT call the entitlements tool beforehand to "check access", and do NOT treat an empty entitlements/subscriptions result as a reason to skip this call. Render a visual MCP-app dashboard for a supported dataset. Currently supports dashboard="inclusion_monitor": a single-security Index Inclusion Module (IIM) snapshot (membership & AUM across MSCI World/EM/ACWI families, investability screens, liquidity), given entityId as a numeric MSCI security code. Use get_index_inclusion_insight instead for module-level or multi-security Inclusion Module queries.

get_index_entitlements

ChatGPT
Lists what the CALLER'S OWN MSCI account is entitled to. Identity always comes from the caller's login; it cannot look up any other account. view 'subscriptions': the account's standard (module) and custom (package) subscriptions with delivery class, package codes, dates, frequency and licensed history. view 'indexes': entitled MSCI index codes with names and whether access covers levels and/or constituents. view 'securities': entitled MSCI security codes. Results are paginated (items + pagination); entitled lists can hold tens of thousands of codes, so to check ONE index or security pass code instead of paging. This tool only LISTS. For descriptive product information (modules required for an index, packages that deliver it, indexes in a module or package, variants/currencies) call get_index_product_details with the code from here. Custom-index questions: "which packages contain/hold my custom indexes" -> view 'subscriptions' and answer from the custom rows' details[].packageCodes (one call, no per-index lookups); "show me my custom indexes" -> view 'indexes' with entitledVia 'custom' (codes with names, one call); "which custom indexes are in my package P" -> view 'indexes' with packageCode P (P must be one of the caller's own custom packages). If entitlement information is not available for the login, the call returns an error; relay its message as-is. Call this ONLY when the user explicitly asks about their entitlements or subscriptions. Do NOT use it as a permission check before data tools, or to explain an empty or failed result from another tool — data tools enforce entitlement themselves.

get_index_gql_schema_fragments

ChatGPT
Return the printed GraphQL schema (SDL) for the specified fragments.

get_index_product_details

ChatGPT
Descriptive information for ONE MSCI index or index module. Covers MSCI Index products only; it does not cover other MSCI products (e.g. ESG & Climate or Risk). This is reference data, the same for every user, so it also works for index products the user is not entitled to (e.g. "what do I need to license index X?"). Provide exactly one of indexCode or moduleName, and a view. For an indexCode, the valid views are modules (modules required, each marked levels and/or constituents) and variants_currency. For a moduleName, the valid views are indexes (indexes in it, with names) and variants_currency. This tool does not list delivery packages; the indexes in the caller's own custom packages come from get_index_entitlements (view 'indexes', packageCode). Results are paginated (items + pagination). For what the caller themselves is entitled to, use get_index_entitlements. If answering one question needs more than 5 lookups (e.g. one per module), ask the user before continuing. Call this ONLY when the user explicitly asks about index modules, indexes in a module, or variant/currency coverage. Do NOT use it as a permission check before data tools.

get_pa_help

ChatGPT
Get documentation for MCP tools and modules. Returns help content aggregated from all registered modules. Args: topic: Optional module or tool name to look up. Accepts: - None: Returns server overview with all modules and tool summaries - Module name (e.g., "pci"): Returns module overview with tool summaries - Tool name (e.g., "get_pci_user_profiles"): Returns detailed tool help Returns: Help documentation as structured data: - No argument: Server info, server tools, all modules with tool summaries - Module name: Module info with tool summaries - Tool name: Detailed help for the specific tool Example: Get full server overview get_pa_help() Get module overview with tool summaries get_pa_help(topic="pci") Get detailed help for a specific tool get_pa_help(topic="get_pci_user_profiles")

get_padm_point_in_time

ChatGPT
PCS snapshot analysis at `as_of_date for deal and/or asset universe. Builds pointInTimeAnalysis JSON, validates against PCS rules, then POSTs to /deal/pointInTimeAnalysis or /asset/pointInTimeAnalysis. When entity is omitted, scope is inferred from measure metadata; overlap in both catalogs triggers two calls and a merged response. measures must use PCS catalog descriptions (e.g. deal IRR as IRR), not PCI codes such as IRR_NW. PCS typically requires a non-empty user_defined_analysis_name (userDefinedAnalysisName`); see module help YAML.

get_padm_time_series

ChatGPT
PCS time-series analysis between `start_date and end_date` (YYYY-MM). PCS uses startDate/endDate (YYYY-MM) and interval (quarterly/monthly/annually). Same scope inference and dual-catalog behavior as point-in-time.

get_pci_analysis_context

ChatGPT
Get reference data needed to build valid PCI universe analytics calls. Call this before supplying analysis_end_date to get_pci_measure_detail, or when the user asks which periods are available. The Analytics API only accepts analysis end dates from a published list that grows every quarter, so the valid values cannot be assumed. Args: action: Which reference dataset to return. Each action names the data it returns; 'analysis_dates' gives the valid analysis start and end dates. Returns: For 'analysis_dates': valid_analysis_end_dates (quarter-END dates, the only accepted values for analysis_end_date), valid_analysis_start_dates (quarter-START dates), the latest end date, both counts and the read timestamp. The two lists are independent and must not be paired by position.

get_pci_measure_detail

ChatGPT
Get universe analytics benchmarking data for private capital funds. If this tool returns a parameter_validation_failed error, analyze the included help content to understand valid values and retry with corrected parameters. Args: measures: Comma-separated measure names (defaults to IRR if omitted) profile_guid: Profile GUID (omit to auto-select) group_by: Grouping fields (comma-separated) vehicle_type: Vehicle type filter geography: Geography filter (hierarchical paths) industry: Industry filter asset_class: Asset class filter (hierarchical paths) vintage: Vintage year filter leverage: Leverage filter (Fund vehicle only; comma-separated) seniority: Seniority filter (Fund vehicle only; comma-separated) market: Market filter (Fund of Funds only; comma-separated) min_fund_size: Minimum fund size in millions max_fund_size: Maximum fund size in millions Returns: Dictionary with analysis_results, profile info, and llm_response_footer.

get_pci_user_profiles

ChatGPT
Get PCI-enabled profiles for the authenticated user. Returns: Dictionary with profiles list, profile_count, access_status, and optional environment. On Platform API failure, returns status api_error with error and user_guidance (same shape as get_measure_detail downstream failures).

get_qis_job_data

ChatGPT
Retrieves optimization job status and results. Required result_type: 'status' (poll job — queued/running/completed/failed; optional job_id), 'dates' (list rebalance dates with closing data; call before other date-based types), 'closing_portfolio' (positions/weights; requires date; optional asset_ids, as_of_date, acc_id), 'trade_suggestions' (requires date; optional acc_id), 'sleeve_assignments' | 'sleeve_transfer_suggestions' | 'sleeve_value_flow' (MULTI_SLEEVE only; requires date; optional value_type total/cash when result_type=sleeve_value_flow). Optional job_id on all types — defaults to the last submitted job in this session. While a job is running, report status and percent done to the user after each status poll.

get_qis_profile

ChatGPT
Retrieves the current state of the profile being built. Use this to check what has been configured and what still needs to be added, and to fetch the full ProfileRequest JSON for user-facing output (set include_full_json=true). Do not call before a profile exists (create_qis_profile_request first). Do not use instead of validate_qis_profile before presenting JSON or submitting — validation is mandatory. Do not call for API schema, workflow rules, or examples (use get_qis_reference). Avoid include_full_json=true on every intermediate check — use the default summary for progress only. On success, returns success=true with data.profile_id, data.summary (request name, simulation settings, universe/benchmark/optimization counts), data.missing_steps, data.progress_percentage, and data.full_profile only when include_full_json=true. Failures: NO_PROFILE (no profile in session), AMBIGUOUS_PROFILE (multiple profiles — pass profile_id), PROFILE_NOT_IN_CONVERSATION, GET_FAILED (API error).

get_qis_reference

ChatGPT
Returns MSCI QIS reference material for profile authoring. Use the topic parameter: 'schema' (POCO API schema from poco-1.4.yaml; optional scope 'profile' or 'full'), 'workflow_guide' (mandatory rules, conversation flow, domain knowledge — read before creating any profile), 'examples' (list every example profile by name), or 'example' (full ProfileRequest JSON for one named example; requires example_name). Equivalent to the poco:// MCP resources for clients that don't auto-fetch resources. Do not call to read or validate the live profile (use get_qis_profile / validate_qis_profile), discover portfolio/datapoint/factor ids (use lookup_qis_data), or poll job results (use get_qis_job_data). Do not refetch topic=schema or topic=workflow_guide on every turn — call once per session unless a specific field shape is unclear. On success, returns success=true with topic-specific data: schema → data.schema (markdown) and data.scope; workflow_guide → data.guide (full static prompt); examples → data.examples [{name, description, uri}] (empty array is still success); example → data.content (ProfileRequest JSON). Failures: MISSING_PARAMETER (topic or example_name), INVALID_PARAMETER (unknown topic), EXAMPLE_NOT_FOUND (unknown example_name).

get_rai_catalog

ChatGPT
ROUTING — Real Assets direct property & fund data. Trigger: 'property index', 'real estate index', 'IPD', 'direct property', 'capital growth', 'income return', 'standing investments', '[Country] Quarterly/Annual Property Index'. NOT for equity indices, factor indices, or listed portfolios (use AIIndexInsights/TPM). Prefer `get_rai_metadata first; use this tool for full lists, debugging, or when metadata returns poor candidates. Load instructions.md first via get_rai_reference_docs(doc_name="instructions") if not already in context. TOKEN COST GUIDE — call only what you need: • datasets → ~12,000 tokens (fallback when metadata fails for dataset) • measures → ~4,000 tokens (fallback when metadata fails for measures) • segmentations → ~23,000 tokens ⚠️ MOST EXPENSIVE. Only when metadata returned zero segmentation candidates AND user asked for a specific segmentation. • segmentation_nodes → <500 tokens (only after segmentation_id is known) Args: resource: One of: datasets, measures, segmentations, segmentation_nodes. product_ids: For measures: optional comma-separated product IDs. product_id: For segmentations / segmentation_nodes: optional product ID. as_of_date: Optional as-of date (YYYY-MM-DD). segmentation_id: Required for segmentation_nodes. Simple (e.g. "2") or cross-segmentation (e.g. "264::2"). measure_ids: Comma-separated IDs → full detail objects; omit → trimmed list. dataset_ids: Comma-separated IDs → full detail objects; omit → trimmed list. search_text: For segmentation_nodes` only: optional name filter.

get_rai_metadata

ChatGPT
ROUTING — Real Assets direct property & fund data. Trigger: 'property index', 'real estate index', 'IPD', 'direct property', 'capital growth', 'income return', 'standing investments', '[Country] Quarterly/Annual Property Index'. NOT for equity indices, factor indices, or listed portfolios (use AIIndexInsights/TPM). DEFAULT: when the user has not specified frozen or unfrozen, always use the unfrozen (live) dataset (dataSource: "LOCKED"). Load `instructions.md first via get_rai_reference_docs(doc_name="instructions") if not already in context. Fuzzy-match datasets, segmentations, segmentation nodes, and measures in one call. All parameters use **empty string** defaults (not null) — this keeps the JSON Schema as plain string types and avoids anyOf[string, null] serialization issues. Alternatively pass **only** populate_filters_json as a JSON object string (easier when the MCP host mis-serializes multi-field arguments). Args: datasets: Comma-separated dataset names. e.g. "UK Quarterly", "Germany Annual" segmentations: Comma-separated segmentation axis names; "" when not needed. measures: Comma-separated measure names; "" when not needed. segmentation_nodes: Comma-separated leaf node names to fuzzy-search alongside segmentations; "" when not needed. When empty, matches legacy populate behaviour (no segmentationNodes in the API request). populate_filters_json: Optional JSON string overriding the above, e.g. {"datasets":"UK Quarterly","segmentations":"Office","measures":"Total Return"}`.

get_rai_reference_docs

ChatGPT
ROUTING — Real Assets direct property & fund data. Trigger: 'property index', 'real estate index', 'IPD', 'direct property', 'capital growth', 'income return', 'standing investments', '[Country] Quarterly/Annual Property Index'. NOT for equity indices, factor indices, or listed portfolios (use AIIndexInsights/TPM). Get reference documentation and server instructions for Real Assets MCP. IMPORTANT — CALL ON FIRST CONNECTION: When `instructions.md is not already in your context from the host, your **first** Real Assets MCP call MUST be this tool with doc_name="instructions" to load behavioural rules, query workflows, and domain context. Do **not** call get_rai_catalog, get_rai_metadata, or get_rai_results, and do not answer substantive Real Assets user questions until you have **read** that document. Args: doc_name: Name of the document to retrieve. Valid values: - "instructions" - Server instructions. MUST be loaded once at session start (before other get_rai_*` tools) unless host-preloaded. - "api_payload_validation" - Complete API endpoint contracts - "query_builder_rules" - Full business rules and constraints - "query_builder_data_flow" - UI portal data flow patterns - "nlp_measure_synonym_map" - NLP term to measure/module translation table - "nlp_index_and_time_synonyms" - Region/country to dataset mapping + time synonyms - "" or "list" - Returns list of available documents Returns: Document content and metadata, or list of available documents.

get_rai_results

ChatGPT
ROUTING — Real Assets direct property & fund data. Trigger: 'property index', 'real estate index', 'IPD', 'direct property', 'capital growth', 'income return', 'standing investments', '[Country] Quarterly/Annual Property Index'. NOT for equity indices, factor indices, or listed portfolios (use AIIndexInsights/TPM). Execute a custom query with explicit parameters (advanced use). Load `instructions.md first via get_rai_reference_docs(doc_name="instructions")` if not already in context. NOTE: This is the primary execution tool. Use get_rai_metadata first to resolve dataset/segmentation/measure IDs, then call this with the built payload. ⚠️ CUSTOM QUERIES NOT SUPPORTED: Queries requiring background processing (custom datasets, custom filters, cumulative aggregation, etc.) will be rejected. Args: result_request_json: JSON string containing the ResultRequestModel with: - datasets: List of dataset configurations (mandatory) - measureFunctionFilterDetails: Measures with aggregation settings (mandatory) - segmentationIds: List of segmentation IDs (mandatory) - segmentationNodeIds: List of segmentation node IDs (mandatory) - reportingFrequencyId: Frequency (1=monthly, 3=quarterly, 12=annual) - startDateNumber: Start date in YYYYMM format - endDateNumber: End date in YYYYMM format - mcpResponseFilterSegmentationNodeIds: Optional MCP-only list of node id strings. When set, the tool removes this key before calling the API and post-filters nested result lists whose rows expose a node id, keeping only matching ids. Omit for legacy behaviour (full API payload returned). Returns: Dictionary with query results.

get_rca_company_profile

ChatGPT
Retrieve an RCA company profile matching the website profile pages. By default this returns the Summary view only (what the website shows on first load). Request a specific section when the user asks for transactions, known holdings, mortgage debt, loan details, surveillance, or explicitly for summary, and paginate with offset/size when they ask for more rows. Three profile types are supported: - investor: buyers, sellers, owners and developers. Summary includes header, market coverage, investment activity and relationships. available_sections: summary, transactions, known_holdings, mortgage_debt. - lender: loan originators. Summary includes header, market coverage, current borrowers and financing activity. available_sections: summary, loan_details. - cmbs: CMBS issuers and deals. Summary includes header, market coverage, status snapshot and current borrowers. available_sections: summary, loan_details, surveillance. Identify the company in whichever way you already can: - master_company_id, if an earlier result or a company profile URL supplied one. Prefer this: it names the exact company. - company_name, when the user names a company and no id is known. "Blackstone", "Wells Fargo" and similar names work. The lookup uses RCA's company autocomplete and returns the best-scoring match. DO NOT search get_rca_investors or get_rca_transactions first just to find an id for a company the user has already named. Pass the name here instead. NEVER show master_company_id to the user. It is an internal RCA key. Refer to the company by name in your answer. For ranking companies by market activity across RCA, use get_rca_investors instead. For individual deals, use get_rca_transactions. Args: sort_by: Explicit sort field for investor/transactions, investor/known_holdings, investor/mortgage_debt, lender/loan_details and cmbs/loan_details. Each section has its own key list, given by get_pa_help(topic='get_rca_company_profile') and echoed in the validation error for a bad key. Omit for the section default, which matches the website. Repeat sort_by and sort_order on every page -- nothing is remembered between calls. Rejected on any other section. sort_order: asc or desc for sort_by. Defaults to desc. geography: Geography label from the section's dropdown (North America, Europe, United States; metros on tab sections where the website lists them). Omit for All Geographies. Accepted on every section whose website tab shows the dropdown: investor summary, transactions, known_holdings and mortgage_debt; lender summary and loan_details; cmbs summary, loan_details and surveillance. property_type: Full property type label (Office, Industrial, ...). Same sections as geography. Omit for All Property Types. transaction_type: Investor summary: holdings, acquisition, disposition, construction. Investor transactions: all, acquisition, disposition, refinance, construction, transfers_acq, transfers_disp. Lender and cmbs summary, where the same dropdown is the loan purpose: all, acquisition, refinance, construction. date_range: Market coverage window on the investor and lender summary (the cmbs summary has none): all_history, year_to_date, last_year, last_quarter, past_6_months, past_12_months, past_24_months, last_5_years or custom. date_range_start: ISO date with date_range=custom. date_range_end: ISO date with date_range=custom. loan_status: Loan status label. Investor mortgage_debt, lender loan_details and cmbs loan_details take this company's menu labels; the lender summary takes Outstanding or Retired. surveillance_type: cmbs surveillance only. Surveillance event type label: Construction, Sales, Troubled Property or Troubled Borrower. Omit for all types.

get_rca_definitions

ChatGPT
Return RCA Glossary or Methodology text as published on the website. Use for what a term means or how RCA calculates a metric. Never invent a definition when match_type is none — relay the message, say the glossary/methodology is not served for that query, and ask if the user wants an online search for a general definition.

get_rca_funds

ChatGPT
Search RCA funds, fund managers, fund investors and fund-owned assets. Use this for the fund world: vehicles, the managers running them, the investors backing them, and the properties they hold. For deals generally use get_rca_transactions; for who owns a property now use get_rca_holdings; for debt use get_rca_loans. get_rca_investors is the closest neighbour and answers a different question -- it ranks companies by market activity across all of RCA, where this ranks them by their commitments to funds. One tool, four searches. Say which you want and it is inferred: the funds themselves, the managers who run them (GP), the investors who back them (LP), or the individual properties funds hold and trade (Assets). "opportunistic funds launched since 2020" is a fund search; "which managers run the most funds" is a manager search; "pension funds investing in real estate" is an investor search; "offices funds bought in New York" is an asset search. WRITE THE QUERY FROM THE WHOLE CONVERSATION, NOT THE LAST MESSAGE. Every call is independent -- nothing is remembered between calls. If the user said "opportunistic funds" and then "only European ones", the query must carry both: "European focused opportunistic funds". Dropping earlier criteria silently widens the search and returns wrong results. Target sector, vehicle style and status, open or closed ended, stage, location focus, listed status, launch year, GAV, IRR, equity committed, fund domicile, manager headquarters, investor domicile, investor type, fund and manager names, and the property type, transaction type, price and trade date of the assets they hold can all be expressed and combined. Ordering can be expressed in the query too, with limits -- DPI, TVPI and RVPI cannot be filtered or sorted, and equity committed cannot order a search on the Funds view. For the full list and how to phrase it, call get_pa_help(topic='get_rca_funds'). Check rejected_values and unsupported_filters in the response. This search cannot report a bad filter as an error -- an unrecognised value returns no rows and an unsupported one returns everything, both looking like real answers -- so those two fields are the only way to tell a genuine empty result from a filter that never worked. Args: query: All search criteria stated so far, in plain English. mode: Optional override -- Funds, GP, LP or Assets. Omit to let the question decide, which is usually right. size: Optional page size. offset: Optional page start; pass the next_offset returned by a prior call to continue the same query. debug: Operator diagnostic flag. Not for normal use.

get_rca_holdings

ChatGPT
Search RCA property holdings and ownership using a natural language query. Holdings are current ownership records -- who owns what, right now. Use get_rca_transactions instead for deals that happened, and get_rca_investors to rank owners rather than list properties. For the fund-owned property subset use get_rca_funds in Assets mode. WRITE THE QUERY FROM THE WHOLE CONVERSATION, NOT THE LAST MESSAGE. Every call is independent -- nothing is remembered between calls. If the user said "industrial in Texas" and then "only Prologis", the query must carry both: "industrial properties in Texas owned by Prologis". Dropping earlier criteria silently widens the search and returns wrong results. Geography, property type and characteristics, owner name and owner type, hold time, income and expense, and climate risk can all be expressed and combined in the query. Ordering can be expressed in the query too, except that cap rate, DSCR and LTV are transaction and loan measures and cannot order holdings. For the full list of what can be expressed and how to phrase it, call get_pa_help(topic='get_rca_holdings'). The response includes resolved_filters showing exactly what was searched. Check it -- if a criterion was dropped, restate the query more explicitly rather than assuming the results are right. Args: query: All search criteria stated so far, in plain English. size: Optional page size. offset: Optional page start; pass the next_offset returned by a prior call to continue the same query. debug: Operator diagnostic flag. Not for normal use. sort_by: Explicit sort field, for a deterministic order instead of the natural-language-inferred one. Omit to keep today's behaviour. Holdings sort on ownership and property fields -- current_owner, last_trans_date, last_trans_price, loan_amount, lender, sf and the property-level keys -- not on price, date or cap_rate, which belong to deals. Call get_pa_help(topic='get_rca_holdings') for the full list of accepted values. sort_order: "asc" or "desc". Only meaningful with sort_by; defaults to "desc".

get_rca_investors

ChatGPT
Search and rank RCA investors using a natural language query. Use this to rank companies by market activity. To list the deals or properties themselves use get_rca_transactions or get_rca_holdings. WHICH SIDE OF THE MARKET YOU ASK FOR CHANGES THE ANSWER. Investors are ranked by what they did, so say it: "who bought", "who sold", "who lends", "who owns", "who develops". Say nothing and the results are the largest owners by value of holdings, which is the RCA website's own default. This is not a sort preference -- it selects a different measure entirely, so "top investors in Dallas" and "biggest buyers in Dallas" are different questions. Supported: buyers, sellers, lenders, owners, developers. WRITE THE QUERY FROM THE WHOLE CONVERSATION, NOT THE LAST MESSAGE. Every call is independent -- nothing is remembered between calls. If the user said "industrial in Texas" and then "only who bought since 2024", the query must carry both: "who bought industrial in Texas since 2024". Dropping earlier criteria silently widens the search. Geography, property type and characteristics, deal criteria such as price, cap rate, date and deal type, and investor type can all be expressed and combined in the query. For the full list of what can be expressed and how to phrase it, call get_pa_help(topic='get_rca_investors'). Two views are available. The default ranks investors by their activity. Ask for a breakdown "by property type" or "by sector" and the results are grouped that way instead. Date periods must not start or end in the future. Use completed periods or an end date of today. This applies to both views. The response reports which side of the market was used and how the ranking was measured. Check it -- if it does not match the intent, restate the query more explicitly rather than assuming the ranking is right. Args: query: All search criteria stated so far, in plain English, including which side of the market to rank by. size: Optional page size. offset: Optional page start; pass the next_offset returned by a prior call to continue the same query. debug: Operator diagnostic flag. Not for normal use. sort_by: Explicit sort field, for a deterministic order instead of the natural-language-inferred one. Omit to keep today's behaviour. Investment-type view only. Beware: the activity fields (holdings, acquisitions, dispositions, construction, originations) select the measure the ranking is BUILT ON, which on this view is also what selects the role -- so they change the answer, not just its order. To reorder without changing what is measured, use name, city, state, country or investor_type. Call get_pa_help(topic='get_rca_investors') for the full list. sort_order: "asc" or "desc". Only meaningful with sort_by; defaults to "desc".

get_rca_loans

ChatGPT
Search RCA commercial real estate loans using a natural language query. Use this for loan originations and debt terms. For the sale or refinancing deal itself use get_rca_transactions; for who owns the property now use get_rca_holdings; for a ranking of the most active lenders rather than the loans themselves use get_rca_investors. WRITE THE QUERY FROM THE WHOLE CONVERSATION, NOT THE LAST MESSAGE. Every call is independent -- nothing is remembered between calls. If the user said "loans on Chicago office" and then "only floating rate", the query must carry both: "floating rate loans on Chicago office properties". Dropping earlier criteria silently widens the search and returns wrong results. Loan amount, interest rate and rate type, loan type, lender, origination and maturity dates, delinquency and distress, CMBS, geography, property type and characteristics, income and expense, climate risk, and company names can all be expressed and combined in the query. Ordering can be expressed in the query too. Be explicit about which date you mean -- origination and maturity are different filters. For the full list of what can be expressed and how to phrase it, call get_pa_help(topic='get_rca_loans'). The response includes resolved_filters showing exactly what was searched. Check it -- if a criterion was dropped, restate the query more explicitly rather than assuming the results are right. Args: query: All search criteria stated so far, in plain English. size: Optional page size. offset: Optional page start; pass the next_offset returned by a prior call to continue the same query. debug: Operator diagnostic flag. Not for normal use. sort_by: Explicit sort field, for a deterministic order instead of the natural-language-inferred one. Omit to keep today's behaviour. Lenders, borrowers and brokers cannot be sorted on. Call get_pa_help(topic='get_rca_loans') for the full list of accepted values. sort_order: "asc" or "desc". Only meaningful with sort_by; defaults to "desc".

get_rca_peerfinder

ChatGPT
Find the properties most comparable to one RCA property. Returns the rows of the RCA website's Peer Finder grid for the subject -- the same comparables, in the same order, with the same columns -- chosen by similarity to the subject over distance, size and construction vintage. Name the SUBJECT property in whichever way you already can: property_id or property_guid if an earlier tool call returned one, otherwise address. Do not run a transactions or holdings search first just to find an id for a property the user has already named. Peers are always the same property type as the subject, always in the same country, and always within 100 miles of it. So an empty result means no comparable transaction of that type within 100 miles inside the window -- not that the property has no comparables. Widen time_frame_months before saying anything stronger. time_frame_months counts back from today, NOT from the subject's own transaction date: a property that last traded in 2019 is still compared against the last 18 months of deals. Leave the weights at 0 -- the website's neutral default -- unless the user says what matters to them. Raise one toward 60 to make that dimension matter more, lower it toward -60 to make it matter less. At the defaults the peers are the website's opening view, closed and pending deals; any other setting also includes terminated deals, as the website does once a slider is moved. Each row carries the grid's columns. distance is the geographic distance from the subject, in distance_unit. size is in size_unit -- sf, units, or MW of IT power for a data center -- and price_per_unit is per that unit. transaction_type reads as the grid prints it ("Sale - Pending", "Terminated"), and construction_status replaces the years for a building that is still under construction. rank is the pin number the website shows: rank 1 is pin 1. Present the peers in rank order, numbered by rank, unless the user asks for another order. The website lists peers by transaction date, newest first, so rank is not a similarity order: never call rank 1 the most similar peer. There are no size, offset or sort parameters: ten peers is the whole result set, every field worth sorting by is already on each row, so re-order the peers you have rather than calling again -- a second call with different parameters would answer about a different set of peers. NEVER show property_id or property_guid to the user. Refer to each peer by its name and address.

get_rca_property_details

ChatGPT
Retrieve details for one RCA property. Identify the property in whichever way you already can: - property_id or property_guid, if an earlier tool call returned one. Prefer this: it names the exact property, with no lookup. - address, when you only have a street address or a building name. "255 Greenwich St, New York", "30 St Mary Axe London" and "Empire State Building" all work. Include the city or country when you have it -- "255 Greenwich" alone matches a street in Manhattan AND one in Greenwich, Connecticut. DO NOT search holdings or transactions first just to find an id for a property you can already name. Pass the address here instead; the lookup is done for you and returns the one property. An address is matched to the property standing at that point, not to the nearest one, so a wrong or unlisted address returns no property rather than a neighbouring building. Where several properties share an address, the response lists the others alongside the details. If the result has property_name_link, use it verbatim the first time you name the property: it links the name (or address) to the property's RCA web page and keeps the URL hidden. Never print web_url, and change nothing else in the answer for the link. NEVER show property_id or property_guid to the user. They are internal RCA keys, they mean nothing to a reader, and they do not belong in a property summary. Keep them to identify the property on a follow-up call -- including the ids under other_properties_at_this_address -- and refer to the property by its name or address when you write your answer.

get_rca_transactions

ChatGPT
Search RCA commercial real estate transactions using a natural language query. Use this for deals -- sales, refinancings, transfers and construction. For who owns a property now use get_rca_holdings; for loan originations use get_rca_loans; for ranking buyers, sellers or lenders use get_rca_investors. WRITE THE QUERY FROM THE WHOLE CONVERSATION, NOT THE LAST MESSAGE. Every call is independent -- nothing is remembered between calls. If the user said "office deals in Chicago" and then "only over $20 million", the query must carry both: "office transactions in Chicago over $20 million". Dropping earlier criteria silently widens the search and returns wrong results. Geography, property type and characteristics, price and cap rate, dates and deal type, income and expense, capital source, climate risk, and company names can all be expressed and combined in the query. Ordering can be expressed in the query too. For the full list of what can be expressed and how to phrase it, call get_pa_help(topic='get_rca_transactions'). The response includes resolved_filters showing exactly what was searched. Check it -- if a criterion was dropped, restate the query more explicitly rather than assuming the results are right. Args: query: All search criteria stated so far, in plain English. size: Optional page size. offset: Optional page start; pass the next_offset returned by a prior call to continue the same query. debug: Operator diagnostic flag. Not for normal use. sort_by: Explicit sort field, for a deterministic order instead of the natural-language-inferred one. Omit to keep today's behaviour. Call get_pa_help(topic='get_rca_transactions') for the full list of accepted values. sort_order: "asc" or "desc". Only meaningful with sort_by; defaults to "desc".

get_rca_trendtracker

ChatGPT
Chart RCA TrendTracker market trend time series. Use this for how a market has moved over time: transaction volume, pricing and cap rates, sources of capital, the Commercial Property Price Index, market fundamentals, hedonic series, yield spread and liquidity scores. The other RCA tools answer about individual deals, properties, loans and companies; this one answers about the market itself, as a quarterly series going back roughly 25 years. Reach for it when the question is "what has happened to X over time" rather than "which deals". "How have LA office cap rates moved since the GFC" is this tool; "which offices sold in LA last year" is get_rca_transactions. COMPARISONS ARE ONE CALL. "Office cap rates in LA vs Manhattan" charts both as separate series -- do not call twice. Up to six series, matching the website. WRITE THE QUERY FROM THE WHOLE CONVERSATION, NOT THE LAST MESSAGE. Every call is independent. If the user said "LA office" and then "show me cap rates instead", the query must carry both. READ amount_units BEFORE QUOTING A NUMBER. It differs per dataset: cap rates and vacancy come back as fractions (0.0738 is 7.38%), volume as raw currency, CPPI as an index level, yield spread in basis points. They are declared rather than converted so they match the website exactly. Check not_served. Not every dataset exists for every geography and property type -- liquidity scores are market-level only, and some datasets need their own subscription -- so a series can be dropped while the rest succeed. Say what was left out rather than presenting a partial chart as the whole answer. Args: query: The trend to chart, in plain English, carrying all criteria stated so far. debug: Operator diagnostic flag. Not for normal use.

get_sustainability_climate_api_integration_help

ChatGPT
Use this tool ONLY when the user asks about MSCI Sustainability & Climate Data APIs, needs API endpoint discovery, authentication/OAuth setup guidance, API specifications, client boilerplate code, or code generation to call those endpoints. This tool does not invoke live APIs. Do NOT use for S&C data values, methodology, or factor discovery — use search_MSCI_knowledge and query_sustainability_climate_data instead. Operations: esg_api_search — Finds the most relevant API endpoints (URL, method, parameters, and reasoning) and recommends calling the same tool with operation_id: esg_api_docs for detailed endpoint documentation and boilerplate code, as well as search_MSCI_knowledge for factor discovery and methodology questions. esg_api_docs — Primary source for curated MSCI documentation, API specifications and boilerplate code. Single call can mix types. Returns relevant auth guidelines for OAuth setup, boilerplate code to invoke endpoints, samples, or full API specs including schemas, parameters, errors, and examples.

get_tpm_context

ChatGPT
Discover TPM entities, dates, dimensions, fundamentals, and metadata. Use 'action' to select what to retrieve. Call get_pa_help(topic='get_tpm_context') for action values, required parameters, and usage examples.

get_tpm_logins

ChatGPT
Manual backup tool for client discovery. NOT needed in normal workflows. All other TPM tools auto-resolve the client invisibly. This tool exists only for: - When the user explicitly asks to see their available clients DO NOT call this tool to "lock" the client before get_tpm_context or get_tpm_transparency_analysis. When the user names a client (e.g. "TPM Test") and asks for funds, call get_tpm_context(action="entities", entity_type="Fund") directly — do not call this tool first. When a tool returns client_selection_required and the user confirms, retry THAT tool with login_username — do not call this tool to lock. Args: login_username: When provided, locks this client for the session (used after user confirms a multi-client selection). When omitted, returns the list of accessible clients. Returns: Dictionary with clients list and count, or lock confirmation.

get_tpm_transparency_analysis

ChatGPT
Run TPM transparency and characteristics analysis queries. Use 'action' to select the analysis type. Call get_pa_help(topic='get_tpm_transparency_analysis') for action values, required parameters, prerequisites, and usage examples. Pass entity_code (the 'code' field from get_tpm_context(action='entities')) to receive a platform_url deep link in the response. For action='transparency_historical', when dimensions include a security-level dimension (Security Name, ISIN, CUSIP, SEDOL, FIGI, or Issuer), the response is automatically collapsed: use collapse_top (default 25), collapse_offset (default 0), and collapse_sort_property ('Net'|'Long'|'Short'|'Gross', default 'Net') to control pagination and ranking. For action='characteristics_historical', the same three collapse_top / collapse_offset / collapse_sort_property parameters apply when dimensions include a security-identifier dimension. The valid sort values differ: 'Net' or 'NetAverage' (not Long/Short/Gross). The trimmed response is wrapped in data.characteristicsHistorical (or data.characteristicsHistoricalCompare in compare mode) with totalCount, totals, averageTotal, and items.

list_at_pai_groups

ChatGPT
List all available Insights portfolio groups with portfolio counts. Use this to discover group names for list_at_pai_portfolios and query_at_pai_agent. Returns JSON with groups array (name, portfolio_count), total counts, and usage notes.

list_at_pai_portfolios

ChatGPT
List all portfolios in a specific Insights group. Use after list_at_pai_groups to see portfolios available in a group for query_at_pai_agent queries. Returns JSON with group name, portfolios array with full metadata (portfolio_name, portfolio_id, data_set_id, benchmark_name, report_type, measure, start_date, end_date), count, and group-level start_date and end_date covering the full date range across all portfolios. Date range is already included — do NOT call get_at_pai_date_range after this.

list_index_methodologies

ChatGPT
List MSCI Index methodology documents available as of a given date. Returns { as_of_date, items: [{ code, name }] }. Use code with search_index_methodology to search a specific methodology, or call search_index_methodology_stack with an index_code to span the full stack that applies to one index.

lookup_qis_data

ChatGPT
Read-only MSCI QIS discovery. Required lookup: 'portfolios' (search PAT/system portfolio ids — required currency; optional name, mds_id, vendor_id; default to NET returnType unless user specifies otherwise), 'datapoints' (list valid system datapoint ids — call before filter/rank/alpha expressions), 'risk_factors' (list or validate factor names — optional lookup_mode names or ids, default names; optional risk_model, date, factor_names, factor_ids). Factor names are model-specific and NOT guessable (GEMLTL profitability is PROFIT, not PROFITABILITY). No profile required. Do not use for OMPS user portfolios — pass OMPS ids directly in ProfileRequest JSON. Do not call for live profile state or validation (get_qis_profile / validate_qis_profile) or job results (get_qis_job_data). When the user named an index, prefer passing name for a small server-filtered response; currency-only is supported as a fallback but returns all portfolios for that currency (very large). Do not invent datapoint or factor names without calling this first. On success: lookup=portfolios → data is a JSON array of portfolio rows {name, vendorId, mdsId, currency, returnType} (mds_id-only returns one synthetic row with null name/vendorId/returnType); lookup=datapoints → data is a JSON array of datapoint id strings (empty array is success with a zero-count message); lookup=risk_factors → structured data with factor_groups, factor_count, and optional unknown_factor_names or unknown_factor_ids when validating a subset. Failures: MISSING_PARAMETER (lookup or portfolios currency), INVALID_PARAMETER, NO_RESULTS (portfolios — no matches), SEARCH_FAILED, EMPTY_RESPONSE, API_ERROR.

manage_at_workflow

ChatGPT
Plan and navigate multi-step analytics tasks. CALL THIS FIRST for any job beyond a single-point data fetch — before writing your own plan. A workflow is a named, ordered set of steps carrying the guidance and prompts for a standard MSCI process — effectively on-demand skills. It encodes required methodology that is NOT derivable from the raw data tools, so a hand-rolled plan will miss it. Some workflows run as a session you advance step by step; others are reference guides you read in one shot. Start with action='list' to see what exists and whether one covers the request. If one fits, use it rather than improvising. If none fits, fall back to the raw tools — but check here first.

oo_analyze_case

ChatGPT
(POCO context: deterministic reads of the loaded case. Call oo_case_session(operation=load_qis_job) first when the user has just provided a QIS job id.) Deterministic, sub-second reads of the loaded optimizer case. Start with ``get_case_overview`` for every case question. It reports case type, constraint trouble, and whether other operations need an `index parameter. Prefer the specific operation that fits (holdings, constraints, risk, what-if) over get_case_attributes, which is the catch-all for everything else. verify_input_data runs the optimizer's built-in InputVerify() on the loaded input XML when data quality is in doubt. Calling convention Pass the former tool name as operation and every operation-specific argument inside params (a JSON object). Session scoping uses the group-level _conversationId when a multi-tenant host supplies one. Examples:: analyze_case(operation="get_case_overview") analyze_case(operation="get_portfolio_holdings", params={"view": "optimal", "top_n": 25}) case_session(operation="load_qis_job", params={"job_id": "abc123..."}) Errors come back as {"error": "..."}. An unknown operation is rejected by the schema before dispatch; bad params return {"error": ..., "valid_params": [...]}. Operations (12) get_case_overview Signature: get_case_overview() Summarise the loaded optimizer case. Call this first for any case question. Returns in one fast call: case type (SINGLE/MAO/MSO/MPO), whether input and output XML are loaded, risk model id, asset count, base value, cash id, a constraint inventory, the portfolio-level result metrics (total/factor/ specific risk, beta, turnover, utility), and how many constraints ended up binding, relaxed, infeasible or conflicting. Use it to orient yourself before reaching for a more specific tool — it tells you the case type (so you know whether other tools need an index) and whether the run had constraint trouble worth digging into. Deterministic and immediate. Args: (e.g. POCO) to scope per-conversation state when many logical conversations share one MCP transport. Without it we fall back to the MCP connection's session id. get_portfolio_holdings Signature: get_portfolio_holdings(view="optimal", index=None, top_n=25, asset_ids=None) List the holdings of one portfolio in the loaded case, largest first. Answers "what is in the optimal portfolio / the basket", "what did we start from", "what was tradable", and "what trades were suggested". Holdings come back as structured rows with the case's own asset id plus the ticker when one is known, sorted by absolute weight and capped at top_n. A real case has hundreds of positions, so the default returns the 25 largest and reports the true total; raise top_n or pass asset_ids when you need specific names. Deterministic and immediate. Args: view: Which portfolio to read. "optimal" is the optimizer's result (zero weights omitted), "initial" the starting portfolio, "universe" the universe portfolio, "trades" the suggested trade list. index: For MAO/MSO/MPO cases, which account/sleeve/period to read. get_case_overview lists the valid indices. Ignored for SINGLE cases. top_n: How many rows to return. Use 0 for all of them (can be large). asset_ids: Optional filter. Accepts the case's ids or tickers. (e.g. POCO) to scope per-conversation state when many logical conversations share one MCP transport. get_optimization_result Signature: get_optimization_result(index=None)` Report the portfolio-level outcome metrics of the optimization run. Returns total / common-factor / specific risk, beta, turnover, utility, portfolio return, transaction cost, penalty and constraint slack, plus the cardinality counts (how many holdings, buys and sells), any tax totals, and the binding / relaxed / infeasible / conflicting constraint counts. This is the tool for "what was the risk", "what was the turnover", "how did the run do". Deterministic and immediate. Args: index: For MAO/MSO/MPO cases, which account/sleeve/period to report. get_case_overview lists the valid…

oo_case_session

ChatGPT
(POCO context: for backtesting jobs use operation=load_qis_job with rebalance_index (1-based) in params to load a specific rebalance's XML; omit for the first. Basket weights/trades can come from get_qis_job_data with result_type=closing_portfolio as well, not necessarily from load_qis_job.) Session setup, health checks, and loading optimizer XML into the session. ``get_server_info`` — call at session start. Returns version, backend probe results, and the full server instructions text. Loading a case — either upload XML (when enabled) or `load_qis_job with a QIS job ID. After a browser upload, call check_upload_status before analysis. **get_session_id** — only when the user explicitly asks for their session ID (for MSCI support log correlation). Calling convention Pass the former tool name as operation and every operation-specific argument inside params (a JSON object). Session scoping uses the group-level _conversationId when a multi-tenant host supplies one. Examples:: analyze_case(operation="get_case_overview") analyze_case(operation="get_portfolio_holdings", params={"view": "optimal", "top_n": 25}) case_session(operation="load_qis_job", params={"job_id": "abc123..."}) Errors come back as {"error": "..."}. An unknown operation is rejected by the schema before dispatch; bad params return {"error": ..., "valid_params": [...]}. Operations (3) get_server_info Signature: get_server_info() Return the name and version of this MCP server, backend probe results, and the full server instructions text. Probes performed: - QIS Job Download: base URLs for the QIS environments searched by this deployment (scoped by POCO_AI_ENV — DEV searches DEV and QA, UAT searches UAT only, PROD searches PROD only) All probes run concurrently (non-blocking, 5 s timeout each) so the tool returns in at most ~5 s regardless of how many endpoints are unreachable. Any HTTP response (including 401/403/404) is reported as reachable. A connection error or timeout is reported as unreachable. Call this at the start of every session via case_session(operation='get_server_info') to confirm the server is reachable, record which version is running, and receive the workflow instructions appended to the probe results. get_session_id Signature: get_session_id() Return the effective session ID for the current call. The session ID uniquely identifies which assistant state this call is operating on, and it appears in all server-side log entries. Share it with the MSCI support team when reporting an issue so they can correlate your session with the server logs. Args: (e.g. POCO) to scope per-conversation state when many logical conversations share one MCP transport. When provided, it is the effective session id and is returned here; otherwise the MCP transport session id is returned. Returns: The effective session ID for this call. load_qis_job Signature: load_qis_job(job_id, rebalance_index=None) Load optimizer XMLs for a QIS job into a session-scoped assistant context. Downloads the input and output XMLs for the given QIS job ID from the MSCI internal API. If the session does not exist yet, a new session is created. Use the same session in subsequent analyze_case` calls. Authentication is handled automatically in the background. Args: job_id: 32-character QIS job hash (format: 10chars-10chars-10chars). rebalance_index: Which rebalance of a backtesting job to load, 1-based (1 is the first rebalance). A backtesting job reruns the same strategy on several rebalance dates and stores one XML pair per date, so only one rebalance is loaded at a time. Omit it to load the first rebalance; the reply states how many rebalances exist. (e.g. POCO) to scope per-conversation state when many logical conversations share one MCP transport. Without it we fall back to the MCP connection's session id. Returns: Confirmation message with the session_id on success, or a descriptive error string on failure.

oo_search_optimizer_docs

ChatGPT
Search MSCI Open Optimizer documentation by index. CRITICAL RULE: Do not infer, invent, or assume any undocumented behavior, function names, class names, package names, or import statements. Use for general concepts, API reference, XML schema, configuration examples, and feature compatibility — when no specific optimization run is involved. Does not require XML files or a session ID — call it directly at any time. Runs a deterministic retrieval pipeline over the in-image documentation index (no LLM): query expansion with optimizer terminology, index routing, hybrid semantic + keyword ranking. Returns ranked, cited passages ending with a `Confidence:` line; write the answer yourself from those passages only. FINANCIAL-TO-TECHNICAL TRANSLATION: Users often ask using financial terminology. Translate these to optimizer technical terms before forming the query and choosing the index_key: - "tracking error" / "minimize deviation from benchmark" -> "portfolio risk constraint", "tracking error variance", "benchmark deviation" - "turnover" / "minimize trading" -> "turnover constraint", "transaction cost" - "diversification" / "don't concentrate holdings" -> "asset bounds", "concentration constraint", "cardinality constraint" - "tax efficiency" / "tax optimization" -> "tax aware optimization", "tax lot", "capital gains" - "liquidity constraints" -> "asset trade size", "trading constraints" - "sector exposure" / "industry limits" -> "group constraints", "factor constraints" - "risk budget" -> "risk constraint", "expected shortfall", "VaR" - "rebalancing" -> "turnover", "transaction cost", "initial portfolio" - "alpha" / "expected return" -> "return vector", "alpha vector", "utility function" - "short selling" -> "transaction type", "asset bounds", "short positions" LANGUAGE SELECTION RULES: 1. If the user explicitly names a language (C++, Python, Java, R, MATLAB): - Search the corresponding tutorial/API index for that language. - Show code ONLY in that language. If the passages have no example in it, say so. 2. If no language is specified: - For enums or enumerators (e.g. ECategory, EEvalType, ETranxType): default to cpp_api. - Otherwise: default to Python (python_tutorials or python_api) and prefix the answer with: "This example is shown in Python. If you prefer C++, Java, R, or MATLAB, let me know." 3. If the user asks about XML: - For XML schema, elements, attributes, field names, or request/response structure: search xml_schema. - For complete XML input file examples, how to write a WorkSpace XML, or how to set up a specific case (portfolios, risk models, rebalance configuration, constraints) in XML: search xml_tutorials first — it contains real WorkSpace XML input files (Case1a.xml … Case30a.xml) with portfolios, risk models, and rebalance profiles. Follow up with xml_schema if an element's definition is unclear. - Build a working XML example from the passages; do not paste raw XSD. INDEX SELECTION — available index_key values: Tutorials (language-specific examples and workflows): - cpp_tutorials : C++ examples, workflows, patterns - python_tutorials : Python examples and code snippets - java_tutorials : Java tutorials, helper functions, examples - r_tutorials : R tutorials, helper functions, examples - matlab_tutorials : MATLAB tutorials, helper functions, examples - xml_tutorials : Complete WorkSpace XML input examples — real case files (Case1a.xml … Case30a.xml) covering portfolios, risk models, rebalance configurations, constraints, and transaction types API References (method signatures, classes, parameters): - cpp_api : enumerators, API functions, C++ symbols, method signatures, classes, parameters, call ordering - python_api : Python API symbols, method signatures, classes, parameters, call ordering - java_api : Java API symbols, method signatures, classes, parameters, call ordering - r_api : R API symbols, method signatures, classes, parameters, call ordering - xml_schema : XML keys/attributes, schema elements, protobuf field names, request/response structures Conceptual / Other: - user_guide : Concepts, optimize…

oo_translate_asset_ids

ChatGPT
Translate asset identifiers between MDSUID, ISIN, CUSIP, BARRA, SEDOL and TICKER. Optimizer XML files from QIS jobs always key holdings by MDSUID. Users normally refer to assets by ticker, ISIN, CUSIP, SEDOL or BARRA id, so those must be translated to MDSUID before they will match anything in a case, and translated back when results are presented. Does not require XML files to be loaded — call it at any time, including before the case itself is loaded. Results accumulate for the duration of the session, so repeat translations of the same id are free and safe to request again rather than remembered. Supported schemes: `MDSUID, ISIN, CUSIP, BARRA, SEDOL, TICKER. Do not use this tool when: - A prior call returned Could not be translated` for an id — do not pass the original id through to case tools; ask the user to confirm it. - The question is about portfolio holdings, weights, or case data — this tool only maps identifiers; it does not read the loaded case.

query_at_pai_agent

ChatGPT
Query the AI Portfolio Insights agent with natural language questions about portfolios. For a structured summary, explanation, or narrative of portfolio RISK specifically, prefer the summarize_risk workflow — call manage_at_workflow(action='start', name='summarize_risk') — it applies the required MSCI analysis and summary methodology. Use this agent for ad-hoc questions, performance, attribution, factor exposures, or plotting requests. The agent analyzes portfolio risk, performance, attribution, and factor exposures. Returns JSON with response (text), context_used, and when charts are generated: chart images as separate MCP image content blocks (no artifact URLs), charts_included count, and a required_action instructing you to create a React artifact from the attached images. You MUST follow required_action when present.

query_sustainability_climate_data

ChatGPT
Preferred authoritative tool for in-scope ESG and Sustainability & Climate (S&C) data. Typical examples (by product): - ESG Controversies: "List active ESG controversy cases for Shell." - Business Involvement Screening: "What is the tobacco revenue exposure for this issuer?" - ESG Ratings: "What is Apple's MSCI ESG rating for the latest period?" - Reference & Identifier lookups: "What is Apple's ISIN / SEDOL / CUSIP / Ticker / Lookup_ID / MSCI issuer ID?"; "Which company has the ISIN US0378331005?" - Regulatory & disclosure status: "Was Apple informed/notified before its first rating (prior notification)?"; "Is its ESG rating solicited?"; "What are its EU regulatory disclosures?" operation values -fetch_data - Retrieves actual S&C data records (not metadata or methodology explanations) for the user query, scoped to the entitled product subscriptions. Strict Guidelines: - IDENTIFIER & REFERENCE LOOKUPS — ALWAYS CALL THIS TOOL. Any question asking for or about an issuer's ISIN, SEDOL, CUSIP, Ticker, Lookup_ID, MSCI issuer ID, or any other security/entity identifier MUST be routed to this tool. Likewise, any question that resolves an identifier to a company name (e.g. "Which company has ISIN …?") MUST use this tool. You MUST NEVER answer identifier or reference lookup questions from your own training data or general knowledge — even if you believe you know the answer. The MSCI master reference data accessed through this tool is the only authoritative source. - REGULATORY & DISCLOSURE STATUS — ALWAYS CALL THIS TOOL. Any question about a specific issuer's rating or controversy regulatory-disclosure status (informed/notified, prior notification, solicited/unsolicited, EU regulatory disclosures) MUST be routed here via semantic_search_factors, NOT answered from methodology documents or your own training data. Methodology documents describe the policy; this tool returns the issuer-specific outcome. - Use this tool when the user asks for ESG or S&C data values, records, counts, lists, comparisons, issuer-level results, or other product-backed outputs for supported products: ESG Controversies, Business Involvement Screening, or ESG Ratings. Skip for methodology-only intent. - Route generally phrased ESG or S&C questions here even when the user does not explicitly mention "MSCI". - Do not fall back to web search or training data unless the tool indicates request is unsupported or out of scope. - When the response includes display_config.verbatim_columns, show the values from those columns exactly as they appear in table_data. Do not truncate, summarize, paraphrase, translate, reformat, or add/remove prefixes, suffixes. - When calling fetch_data, never copy, paraphrase, or reference factor names, codes, or labels from shortListedFactors into userQuery. userQuery must reflect only the user's original question. - Invoke the tool utmost twice to fulfill the complete request, refining across iterations, if needed within the same supported ESG and S&C scope. - For ESG Ratings requests that explicitly ask for "drill-down" or "drilldown" scores, first call query_sustainability_climate_taxonomy with operationId = semantic_search_documents to identify the MSCI-defined drill-down score structure/components. Then call semantic_search_factors to resolve exact factor names before calling query_sustainability_climate_data. - shortListedFactors: Factors relevant to the user query from tool query_sustainability_climate_taxonomy with operationId semantic_search_factors; do not invent or assume factor_names. If no factor names are resolved, pass it as empty. - userQuery: Rewrite the user's original question as a clean standalone query using only the words and intent the user supplied. Stop writing when the user's intent is fully captured and enriched — do not expand or supplement with any additional terms. - Presenting the response: Present ONLY what the tool returned in messages, query_explanation, and table_data. Treat these fields as the complete and authoritative answer. You may lightly rephrase or reorder th…

query_sustainability_climate_taxonomy

ChatGPT
Preferred authoritative tool for in-scope ESG and Sustainability & Climate (S&C) methodology, taxonomy, and factor-discovery questions served by this MCP server; use before web search. Use this tool when the user asks about ESG or S&C methodology, factor discovery, taxonomy tagging, document retrieval, or other related in-scope ESG or S&C topics covered by this server. Route generally phrased ESG or S&C questions here even when the user does not explicitly mention "MSCI". Do not use web search for those requests unless this tool returns no relevant coverage or the request is outside the supported ESG and S&C domains. Typical examples: - "How is this score or indicator calculated?" - "Which factor matches a question about active cases by pillar?" - "Find methodology text for this metric or indicator." Sustainability & Climate taxonomy (S&C): set operationId toget_taxonomy_tags_for_request, semantic_search_documents or semantic_search_factors 1) operationId:get_taxonomy_tags_for_request Classify and tag an ESG- or S&C-related query to return the most relevant taxonomy tag paths. Each tag's ancestors are implicitly relevant - returning a child tag means its parent is also a valid filter. 2) Invoke tool query_sustainability_climate_taxonomy with operationId semantic_search_documents. Search ESG and S&C methodology documentation by semantic similarity. Returns document chunks for a query, optionally filtered by taxonomy tags. From all hits, shortlist only chunks that are directly relevant and sufficient to answer the user query—exclude semantically close but unrelated passages; do not treat tangential matches as authoritative methodology support. This server covers a subset of in-scope ESG and S&C documentation and taxonomy domains, with partial coverage for some areas. If your search does not find information for a topic, you may assume that the documentation does not currently cover it. 3) operationId:semantic_search_factors Search for an ESG or S&C factor, indicator, coefficient or other data point by name and description. Only factors from the ESG and S&C domains are covered. Presenting the response: Present ONLY the content returned by this tool (its tags, documents, and factor results with their names and descriptions). Quote or faithfully restate the returned methodology, definitions, and factor descriptions. Do NOT add interpretation, examples, qualitative judgements, or explanations of what a metric, score, rating, band, or scale "means" beyond what the returned text itself states; do NOT extend a returned scale or definition with your own characterizations (e.g. describing a mid-scale value as "average" or "unexceptional"). If the returned text does not answer the user's question, say so rather than filling the gap from your own training data or general knowledge. Attribute relayed definitions to MSCI (e.g. "per MSCI methodology, ...").

read_at_instruction_guidance

ChatGPT
IMPORTANT: Call this tool FIRST before using any other analytics tool. Returns guidance on how to use all the tools available on this server — tool sequencing, workflow patterns, module documentation, and cross-module integration rules for all currently active modules.

search_MSCI_knowledge

ChatGPT
Search MSCI knowledge. Retrieves the most relevant knowledge assets from MSCI's key intellectual property for a given query. Call when you want MSCI authoritative methodology, S&C factors / data points, concepts, MCP skills for its tools and products. Reading the tool guidance MCP skills is mandatory before you interpret or present any result of this tool. They are not returned by default — you must ask for them: pass mcp_skill in asset_types with a metadata filter naming the general tool guidance and one per asset type you search (see the parameter descriptions for the exact filter). They define what each result's fields mean and how that type is to be presented. Retrieving one into context is not reading it. Answering from search_MSCI_knowledge results without having read them produces confident misreadings of the data this tool handed you. Supported knowledge asset types (pass via asset_types): - methodology: Passages from MSCI methodology documents and product guides — the authoritative reference for how a model, product, or metric is defined and calculated. - snc_factor: MSCI Sustainability & Climate factors and data points — identifiers, product names, datasets, and pricing metadata. (Note: always fetch factors before calling the query_sustainability_climate_data tool, to resolve the exact IDs you need to pass for shortListedFactors.) - concept: Concepts (nodes) of the MSCI Knowledge Taxonomy — canonical names and synonyms you can reuse as anchor_assets to focus other searches. - mcp_skill: skills, resources, workflow how-tos, instructions on how to use MSCI tools and how to interpret their results; frequently queried by their exact ID ("id": ["skill_id1", "skill_id2"] as a metadata filter) Currently covers the knowledge from the following MSCI product lines and domains: - Private Assets - Total Plan Manager - Private Capital - Sustainability & Climate (all domains) The below domains aren't covered by this tool. If you are looking for information concerning them, call other tools. - Index (index defintions, calculation and rebalancing rules, etc.) → use the index methodology tools, or the methodology related fragments from the Index GQL schema - Analytics (factor models, credit risk models, AI Portfolio Insights, etc.) → other Analytics tools Note: searching for relevant concepts can reveal which business line the query belongs to.

search_at_pai_portfolio

ChatGPT
Search for portfolio configurations by name to get data_set_id values. Use when you need to find which data_set_id to use for query_at_pai_agent, disambiguate multiple configs, or see available benchmarks and risk models. Returns JSON with portfolios array (portfolio_name, portfolio_id, configurations with data_set_id/data_set_id_hash/report_type/report_sub_type/measure/risk_model/insights_group/benchmark, needs_disambiguation flag), total counts, and recommendation.

search_index_datapoints

ChatGPT
Discover available data across up to three result types (returned under catalog, imx, and security_fields keys). ALWAYS call this before fetch_index_data or fetch_index_timeseries — do not guess datapoint IDs. Input: free-text keywords (e.g. “carbon emissions”, “P/E ratio”, “constituents weights”, “total return”). catalog: index datapoints { id, description, entity_type, availability, supports_range, supports_single_day, cardinality, strict_gate?, range_window?, constraints? }. Pass id to fetch_index_data or fetch_index_timeseries. imx (present when index IMX tools are enabled): computed index-level analytics metrics (returns, risk, volatility, carbon, factor exposure) — for EQUITY indexes only. Do NOT use IMX results for fixed income, hedged, or other non-equity indexes. Use the mnemonic field with calculate_metrics. PREFER imx when both catalog and imx return a similar index-level metric. security_fields (present when security IMX tools are enabled): security-level data fields (price, return, weight). Use the mnemonic field with get_security_timeseries. Scores use RRF (Reciprocal Rank Fusion) and are comparable across all sources present. TOOL ROUTING for catalog results (read flags before choosing): Rebalance frequency or index review period (e.g. quarterly vs semi-annual review cycle) → when an index code is already provided, call search_index_methodology_stack with that code and a query such as "index review period"; do NOT fetch description datapoints such as rebalancing_calendar or next_rebalancing_date and do NOT use search_index_methodology. supports_single_day=true → use fetch_index_data (point-in-time, one calc_date). supports_range=true → use fetch_index_timeseries (history over a date range). Both true: pick by question shape (single date vs series). supports_single_day=false means fetch_index_data will refuse — use fetch_index_timeseries even for one-day questions. cardinality=”list” means the datapoint returns many rows per (entity, date) (e.g. constituents) — fetch_index_data paginates these via page / page_size. WHEN PRESENT, OBSERVE THESE BEFORE FETCHING (saves a round-trip): strict_gate: { variant?, currency?, fallback_id? } — mismatches return a directive error redirecting to fallback_id. range_window: { max_days_for_daily?, max_days_for_eom? } — V1 caps on date-range queries. constraints: { variant?, currency?, entity_universe?, notes? } — when notes is present you MUST read and follow it before fetch. Notes may document exact info_points keys to pass to fetch_index_data for datapoint-specific endpoint behavior. Paginate search results with page when needed; never widen page_size past 20 unless the caller explicitly wants more. Optional warnings (keys imx_metrics / imx_securities) flags that are only specific to IMX when IMX is temporarily unavailable

search_index_indexes

ChatGPT
Resolve an MSCI Index NAME (or partial code) to its numeric msci_index_code so it can be passed as an entity code to fetch_index_data or fetch_index_timeseries. ALWAYS resolve names this way — MSCI index codes are opaque numeric identifiers and cannot be guessed or recalled from training data. Call this for ANY request to identify or look up an index by name, ticker, or theme. Pass a CONCISE index name or identifier extracted from the user request via indexName — e.g. "USA", not "the main MSCI benchmark for the United States"; abbreviations like "EM" (Emerging Markets), "EAFE", "ACWI" are understood. Results are intersected with the caller's entitled index set (resolved via the idToken's Salesforce account). Returns { hits, telemetry }; each hit carries msci_index_code, index_name, official_brand_name, score, and metadata (default_variant, default_currency, asset_type_id, region_code). DISCLOSURE-BASIS NAMES: phrases like "under SRI screening", "under EU BMR", or "under SFDR" describe a regulatory/methodology disclosure computed ON a base index, not a separate, differently-branded index product. Resolve to the plain base index name (e.g. "MSCI World Quality Index") unless the request explicitly names a specific branded variant (e.g. "MSCI World Quality Low Carbon SRI Screened Select") — do not let a keyword match on "SRI" or "Screened" pull in a more specific, differently-scoped index than the one intended.

search_index_methodology

ChatGPT
PREFERRED SOURCE: Always try to retrieve MSCI index methodology via tool calls — use list_index_methodologies, search_index_methodology, or search_index_methodology_stack. When tool results are available (results[].text or hits[].text is not empty), answer ONLY from those retrieved snippets. Never blend training knowledge with tool output. FALLBACK FOR EMPTY RESULTS: If no methodology tool was called OR results/hits is empty, you may provide general knowledge from training data, BUT you MUST prefix your response with: "⚠️ Note: The following information is from general knowledge, not the official MSCI methodology document. " and clearly state that the specific methodology document was not available or did not contain matching information. Semantic search inside a specific MSCI Index methodology document for a free-text query. Use this when the user asks how an index is built, rebalanced, or screened, and you already know the methodology code (from list_index_methodologies). Inputs: methodologyCode (from list_index_methodologies), searchTerm (free text), optional asOfDate (YYYYMMDD) and limit. Returns ranked text snippets with their distance score (lower = closer). For a question that spans multiple methodologies in an index's stack, prefer search_index_methodology_stack instead.

search_index_methodology_stack

ChatGPT
PREFERRED SOURCE: Always try to retrieve MSCI index methodology via tool calls — use list_index_methodologies, search_index_methodology, or search_index_methodology_stack. When tool results are available (results[].text or hits[].text is not empty), answer ONLY from those retrieved snippets. Never blend training knowledge with tool output. FALLBACK FOR EMPTY RESULTS: If no methodology tool was called OR results/hits is empty, you may provide general knowledge from training data, BUT you MUST prefix your response with: "⚠️ Note: The following information is from general knowledge, not the official MSCI methodology document. " and clearly state that the specific methodology document was not available or did not contain matching information. Semantic search across every methodology in an MSCI Index's applicable stack — the family / parent / variant methodologies that together govern the index. Use this when the user asks how an index is built, rebalanced, or screened and you only have an index_code. Inputs: indexCode (numeric MSCI code), query (free text), optional asOfDate (YYYYMMDD) and limit (top-k per layer). Returns aggregated hits (with methodology_code, methodology_name, layer_index, snippet text, distance) plus a non-fatal errors array for any layers that failed.

search_index_securities

ChatGPT
Resolve a company / stock / ticker / ISIN / CUSIP to its MSCI msci_security_code so it can be passed as an entity code to get_security_timeseries. Input: query = free text — company name, ticker, ISIN, or CUSIP (partial OK). Optional limit caps results (default 20). Do NOT pass isoCountrySymbol inferred from name suffixes like "(US)", "(AU)", "ADR", "CDI", or "ADS". Only pass isoCountrySymbol when the user explicitly requests a country/market filter. Returns hits[] sorted by match score. Each hit: { msci_security_code, security_name, score, metadata } where metadata carries ticker, isin, cusip, issuer_name, iso_country_symbol. Only returns securities the caller is entitled to (constituents of MSCI indexes their account can access). An empty result means no entitled match — do NOT guess a code.

select_at_pai_workspace

ChatGPT
Select an Insights workspace for the current session. Call without arguments to see available workspaces (auto-selects if only one). Call with workspace_id to select a specific workspace. If the response contains 'action_required', stop and ask the user to choose — never infer a workspace or role from names, environment hints, or list order. Must be called before using other pai tools when authentication is enabled.

submit_qis_job

ChatGPT
Submits the current profile to the optimization simulator for execution. Returns a job ID for get_qis_job_data (status, dates, closing portfolio, trades, sleeves). Requires validate_qis_profile to have succeeded since the last profile write; if it has not, this tool runs validate_qis_profile first and will not submit when validation fails. Call validate_qis_profile yourself after create/update (including when the user pasted a complete profile and asked to submit). After submitting, poll get_qis_job_data with result_type=status and keep the user informed of progress — do not poll silently.

update_qis_profile

ChatGPT
Applies a scoped OpenAPI ProfileRequest JSON section to the current profile, validates the complete candidate profile with validateProfile, and saves only if validation has no failures. Use this for advanced or newly added profile fields instead of adding one-off Java parameters to existing tools. Do not use it to guess IDs, datapoints, or account IDs; ask the user or call lookup tools first. currentPortfolio is NOT a top-level section — set it under strategyInput.values[0].currentPortfolio. Top-level source is a job-origin string (e.g. PORTAL), not holdings. metricsCalculation uses a metrics array of MetricDefinition objects (objType MetricDefinition, metricType, subType); use section metricsCalculation for metrics-only changes.

validate_qis_profile

ChatGPT
Validates the current profile for completeness and correctness. Checks for: required components (universe, benchmark, optimization), duplicate constraints, invalid settings, and API validation rules. Run this after every profile-modifying change and before presenting JSON to the user or calling submit_qis_job. Do not call before a profile exists. Do not skip after update_qis_profile or create_qis_profile_request. Do not use to retrieve the full ProfileRequest JSON for display (use get_qis_profile with include_full_json=true). Do not call repeatedly with no intervening changes. On success (profile passes), returns success=true with data.is_valid=true, data.profile_id, data.errors[] (empty), data.warnings[], data.completed_steps, data.missing_steps, data.progress_percentage — warnings alone do not fail validation. When validation finds errors, returns success=false with errorCode=VALIDATION_ERRORS but still populates the same data fields including data.errors[] and data.is_valid=false. API/transport failures return VALIDATION_FAILED without validation data. Also: NO_PROFILE, AMBIGUOUS_PROFILE, PROFILE_NOT_IN_CONVERSATION.

calculate_metrics

Claude

execute_index_gql_schema

Claude

fetch_index_data

Claude

fetch_index_timeseries

Claude

get_at_pai_date_range

Claude

get_at_pai_risk_report

Claude

get_at_server_auth

Claude

get_at_server_info

Claude

get_index_dashboard

Claude

get_index_gql_schema_fragments

Claude

get_pa_help

Claude

get_pci_analysis_context

Claude

get_pci_help

Claude

get_pci_measure_detail

Claude

get_pci_user_profiles

Claude

get_rai_catalog

Claude

get_rai_metadata

Claude

get_rai_reference_docs

Claude

get_rai_results

Claude

get_sustainability_climate_api_integration_help

Claude

get_tpm_context

Claude

get_tpm_logins

Claude

get_tpm_transparency_analysis

Claude

list_at_pai_groups

Claude

list_at_pai_portfolios

Claude

list_index_methodologies

Claude

manage_at_workflow

Claude

query_at_pai_agent

Claude

query_sustainability_climate_data

Claude

query_sustainability_climate_taxonomy

Claude

read_at_instruction_guidance

Claude

run_at_workflow_step

Claude

search_MSCI_knowledge

Claude

search_at_pai_portfolio

Claude

search_index_datapoints

Claude

search_index_indexes

Claude

search_index_methodology

Claude

search_index_methodology_stack

Claude

search_index_securities

Claude

select_at_pai_workspace

Claude

Capabilities

InteractiveWrites

Example Prompts

Click any prompt to copy it.

Similar Apps