Serveur MCP

PortfolioFit

fit.portfolio/portfoliofit
Données et analytique Finance et investissement Public et accessible MCP 2025-11-25

Ce que fait ce MCP

Calculates portfolio constraints and evaluates normalized holdings against investment mandates.

calculate_portfolio_constraints
Calculate portfolio constraints
Calculate explicit portfolio constraints deterministically from normalized holdings. Use this for arithmetic checks, not for interpreting natural-language mandates.
Idempotent
Schéma d’entrée
{'type': 'object', '$defs': {'ExposureFilter': {'type': 'object', 'title': 'ExposureFilter', 'required': ['dimension', 'match', 'values'], 'properties': {'match': {'enum': ['equals', 'not_equals', 'in', 'not_in'], 'type': 'string', 'title': 'Match'}, 'values': {'type': 'array', 'items': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'title': 'Values', 'maxItems': 100, 'minItems': 1}, 'dimension': {'enum': ['denomination_currency', 'country', 'domicile', 'issuer_country', 'listing_country', 'asset_class', 'rating', 'sector'], 'type': 'string', 'title': 'Dimension'}}, 'additionalProperties': False}, 'AlignmentHolding': {'type': 'object', 'title': 'AlignmentHolding', 'required': ['id', 'name'], 'properties': {'id': {'type': 'string', 'title': 'Id', 'maxLength': 120, 'minLength': 1}, 'name': {'type': 'string', 'title': 'Name', 'maxLength': 500, 'minLength': 1}, 'value': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Value', 'default': None}, 'weight': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Weight', 'default': None, 'description': 'Portfolio weight. Prefer a decimal share such as 0.24 for 24%. Percentage-point inputs such as 24 are also accepted and normalized when the supplied holdings use that convention.'}, 'currency': {'type': 'string', 'title': 'Currency', 'default': '', 'maxLength': 16}, 'attributes': {'type': 'object', 'title': 'Attributes', 'maxProperties': 100, 'additionalProperties': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'number'}, {'type': 'boolean'}, {'type': 'null'}]}}, 'source_reference': {'type': 'string', 'title': 'Source Reference', 'default': '', 'maxLength': 500}}, 'additionalProperties': False}, 'DeterministicConstraint': {'type': 'object', 'title': 'DeterministicConstraint', 'required': ['id', 'metric', 'operator'], 'properties': {'id': {'type': 'string', 'title': 'Id', 'maxLength': 120, 'minLength': 1}, 'top_n': {'anyOf': [{'type': 'integer', 'maximum': 1000, 'minimum': 1}, {'type': 'null'}], 'title': 'Top N', 'default': None}, 'metric': {'enum': ['single_holding_weight', 'selected_holdings_weight', 'filtered_holdings_weight', 'top_n_holdings_weight', 'holding_count', 'total_weight'], 'type': 'string', 'title': 'Metric'}, 'operator': {'enum': ['<', '<=', '=', '!=', '>=', '>', 'range'], 'type': 'string', 'title': 'Operator'}, 'max_value': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Max Value', 'default': None}, 'min_value': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Min Value', 'default': None}, 'threshold': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Threshold', 'default': None}, 'holding_ids': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Holding Ids', 'maxItems': 1000}, 'exposure_filter': {'anyOf': [{'$ref': '#/$defs/ExposureFilter'}, {'type': 'null'}], 'default': None}}, 'additionalProperties': False}}, 'title': 'calculate_portfolio_constraintsArguments', 'required': ['holdings', 'constraints', 'idempotency_key'], 'properties': {'holdings': {'type': 'array', 'items': {'$ref': '#/$defs/AlignmentHolding'}, 'title': 'Holdings', 'maxItems': 1000, 'minItems': 1}, 'constraints': {'type': 'array', 'items': {'$ref': '#/$defs/DeterministicConstraint'}, 'title': 'Constraints', 'maxItems': 250, 'minItems': 1}, 'base_currency': {'type': 'string', 'title': 'Base Currency', 'default': 'USD', 'maxLength': 16, 'minLength': 1}, 'idempotency_key': {'type': 'string', 'title': 'Idempotency Key', 'maxLength': 255, 'minLength': 1}, 'source_warnings': {'anyOf': [{'type': 'array', 'items': {'type': 'string', 'maxLength': 2000, 'minLength': 1}, 'maxItems': 100}, {'type': 'null'}], 'title': 'Source Warnings', 'default': None}, 'composition_scope': {'enum': ['complete', 'partial', 'unknown'], 'type': 'string', 'title': 'Composition Scope', 'default': 'unknown'}}}
Schéma de sortie
{'type': 'object', '$defs': {'InvocationMeta': {'type': 'object', 'title': 'InvocationMeta', 'required': ['idempotent_replay', 'plan', 'monthly_invocations', 'monthly_invocation_limit', 'monthly_tokens'], 'properties': {'plan': {'type': 'string', 'title': 'Plan'}, 'monthly_tokens': {'$ref': '#/$defs/MonthlyTokenUsage'}, 'idempotent_replay': {'type': 'boolean', 'title': 'Idempotent Replay'}, 'monthly_invocations': {'type': 'integer', 'title': 'Monthly Invocations'}, 'monthly_invocation_limit': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Monthly Invocation Limit'}}, 'additionalProperties': False}, 'ConstraintResult': {'type': 'object', 'title': 'ConstraintResult', 'required': ['id', 'metric', 'status', 'message'], 'properties': {'id': {'type': 'string', 'title': 'Id'}, 'actual': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Actual', 'default': None}, 'metric': {'enum': ['single_holding_weight', 'selected_holdings_weight', 'filtered_holdings_weight', 'top_n_holdings_weight', 'holding_count', 'total_weight'], 'type': 'string', 'title': 'Metric'}, 'status': {'enum': ['pass', 'fail', 'insufficient_evidence'], 'type': 'string', 'title': 'Status'}, 'message': {'type': 'string', 'title': 'Message'}, 'holding_ids': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Holding Ids'}}, 'additionalProperties': False}, 'MonthlyTokenUsage': {'type': 'object', 'title': 'MonthlyTokenUsage', 'properties': {'input_tokens': {'type': 'integer', 'title': 'Input Tokens', 'default': 0}, 'total_tokens': {'type': 'integer', 'title': 'Total Tokens', 'default': 0}, 'output_tokens': {'type': 'integer', 'title': 'Output Tokens', 'default': 0}}, 'additionalProperties': False}, 'CapabilityLimitUsage': {'type': 'object', 'title': 'CapabilityLimitUsage', 'required': ['used', 'limit', 'started_at', 'resets_at'], 'properties': {'used': {'type': 'integer', 'title': 'Used', 'minimum': 0}, 'limit': {'type': 'integer', 'title': 'Limit', 'minimum': 0}, 'period': {'type': 'string', 'const': 'calendar_month', 'title': 'Period', 'default': 'calendar_month'}, 'resets_at': {'type': 'string', 'title': 'Resets At', 'format': 'date-time'}, 'started_at': {'type': 'string', 'title': 'Started At', 'format': 'date-time'}}, 'additionalProperties': False}, 'PortfolioConstraintsOutput': {'type': 'object', 'title': 'PortfolioConstraintsOutput', 'required': ['capability', 'status', 'meta'], 'properties': {'meta': {'$ref': '#/$defs/InvocationMeta'}, 'status': {'enum': ['compliant', 'non_compliant', 'insufficient_evidence'], 'type': 'string', 'title': 'Status'}, 'results': {'type': 'array', 'items': {'$ref': '#/$defs/ConstraintResult'}, 'title': 'Results'}, 'warnings': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Warnings'}, 'capability': {'type': 'string', 'const': 'portfolio_constraints.v1', 'title': 'Capability'}}, 'additionalProperties': False}, 'CapabilityLimitExceededOutput': {'type': 'object', 'title': 'CapabilityLimitExceededOutput', 'required': ['code', 'status', 'message', 'capability', 'plan', 'usage', 'resolution_paths'], 'properties': {'code': {'type': 'string', 'const': 'capability_limit_exceeded', 'title': 'Code'}, 'plan': {'type': 'string', 'title': 'Plan'}, 'usage': {'$ref': '#/$defs/CapabilityLimitUsage'}, 'status': {'type': 'string', 'const': 'quota_exceeded', 'title': 'Status'}, 'message': {'type': 'string', 'title': 'Message'}, 'capability': {'type': 'string', 'title': 'Capability'}, 'retryable_now': {'type': 'boolean', 'const': False, 'title': 'Retryable Now', 'default': False}, 'resolution_paths': {'type': 'array', 'items': {'$ref': '#/$defs/CapabilityLimitResolutionPath'}, 'title': 'Resolution Paths', 'minItems': 1}, 'same_idempotency_key_reusable': {'type': 'boolean', 'const': True, 'title': 'Same Idempotency Key Reusable', 'default': True}}, 'additionalProperties': False}, 'CapabilityLimitResolutionPath': {'type': 'object', 'title': 'CapabilityLimitResolutionPath', 'required': ['id', 'label', 'description'], 'properties': {'id': {'type': 'string', 'title': 'Id', 'maxLength': 64, 'minLength': 1}, 'url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Url', 'default': None}, 'label': {'type': 'string', 'title': 'Label', 'maxLength': 120, 'minLength': 1}, 'description': {'type': 'string', 'title': 'Description', 'maxLength': 500, 'minLength': 1}, 'available_at': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Available At', 'default': None}}, 'additionalProperties': False}}, 'anyOf': [{'$ref': '#/$defs/PortfolioConstraintsOutput'}, {'$ref': '#/$defs/CapabilityLimitExceededOutput'}], 'title': 'PortfolioConstraintsToolOutput'}
evaluate_portfolio_alignment
Evaluate portfolio alignment
Compare a clean mandate with normalized holdings. Do not send PDF, CSV, spreadsheet, or factsheet files; extract them before calling.
Idempotent
Schéma d’entrée
{'type': 'object', '$defs': {'AlignmentRule': {'type': 'object', 'title': 'AlignmentRule', 'required': ['target', 'operator'], 'properties': {'id': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Id', 'default': None}, 'unit': {'type': 'string', 'title': 'Unit', 'default': 'percent', 'maxLength': 64}, 'title': {'type': 'string', 'title': 'Title', 'default': '', 'maxLength': 200}, 'target': {'type': 'string', 'title': 'Target', 'maxLength': 500, 'minLength': 1}, 'enabled': {'type': 'boolean', 'title': 'Enabled', 'default': True}, 'operator': {'enum': ['<', '<=', '=', '!=', '>=', '>', 'range'], 'type': 'string', 'title': 'Operator'}, 'max_value': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Max Value', 'default': None}, 'min_value': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Min Value', 'default': None}, 'threshold': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Threshold', 'default': None}, 'explanation': {'type': 'string', 'title': 'Explanation', 'default': '', 'maxLength': 2000}, 'exposure_filter': {'anyOf': [{'$ref': '#/$defs/ExposureFilter'}, {'type': 'null'}], 'default': None}}, 'additionalProperties': False}, 'ExposureFilter': {'type': 'object', 'title': 'ExposureFilter', 'required': ['dimension', 'match', 'values'], 'properties': {'match': {'enum': ['equals', 'not_equals', 'in', 'not_in'], 'type': 'string', 'title': 'Match'}, 'values': {'type': 'array', 'items': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'title': 'Values', 'maxItems': 100, 'minItems': 1}, 'dimension': {'enum': ['denomination_currency', 'country', 'domicile', 'issuer_country', 'listing_country', 'asset_class', 'rating', 'sector'], 'type': 'string', 'title': 'Dimension'}}, 'additionalProperties': False}, 'AlignmentHolding': {'type': 'object', 'title': 'AlignmentHolding', 'required': ['id', 'name'], 'properties': {'id': {'type': 'string', 'title': 'Id', 'maxLength': 120, 'minLength': 1}, 'name': {'type': 'string', 'title': 'Name', 'maxLength': 500, 'minLength': 1}, 'value': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Value', 'default': None}, 'weight': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'title': 'Weight', 'default': None, 'description': 'Portfolio weight. Prefer a decimal share such as 0.24 for 24%. Percentage-point inputs such as 24 are also accepted and normalized when the supplied holdings use that convention.'}, 'currency': {'type': 'string', 'title': 'Currency', 'default': '', 'maxLength': 16}, 'attributes': {'type': 'object', 'title': 'Attributes', 'maxProperties': 100, 'additionalProperties': {'anyOf': [{'type': 'string'}, {'type': 'integer'}, {'type': 'number'}, {'type': 'boolean'}, {'type': 'null'}]}}, 'source_reference': {'type': 'string', 'title': 'Source Reference', 'default': '', 'maxLength': 500}}, 'additionalProperties': False}}, 'title': 'evaluate_portfolio_alignmentArguments', 'required': ['holdings', 'idempotency_key'], 'properties': {'rules': {'anyOf': [{'type': 'array', 'items': {'$ref': '#/$defs/AlignmentRule'}, 'maxItems': 250}, {'type': 'null'}], 'title': 'Rules', 'default': None}, 'mandate': {'type': 'string', 'title': 'Mandate', 'default': '', 'maxLength': 50000}, 'holdings': {'type': 'array', 'items': {'$ref': '#/$defs/AlignmentHolding'}, 'title': 'Holdings', 'maxItems': 1000, 'minItems': 1}, 'base_currency': {'type': 'string', 'title': 'Base Currency', 'default': 'USD', 'maxLength': 16, 'minLength': 1}, 'portfolio_name': {'type': 'string', 'title': 'Portfolio Name', 'default': 'Portfolio', 'maxLength': 255}, 'idempotency_key': {'type': 'string', 'title': 'Idempotency Key', 'maxLength': 255, 'minLength': 1}, 'source_warnings': {'anyOf': [{'type': 'array', 'items': {'type': 'string', 'maxLength': 2000, 'minLength': 1}, 'maxItems': 100}, {'type': 'null'}], 'title': 'Source Warnings', 'default': None}, 'composition_scope': {'enum': ['complete', 'partial', 'unknown'], 'type': 'string', 'title': 'Composition Scope', 'default': 'unknown'}}}
Schéma de sortie
{'type': 'object', '$defs': {'InvocationMeta': {'type': 'object', 'title': 'InvocationMeta', 'required': ['idempotent_replay', 'plan', 'monthly_invocations', 'monthly_invocation_limit', 'monthly_tokens'], 'properties': {'plan': {'type': 'string', 'title': 'Plan'}, 'monthly_tokens': {'$ref': '#/$defs/MonthlyTokenUsage'}, 'idempotent_replay': {'type': 'boolean', 'title': 'Idempotent Replay'}, 'monthly_invocations': {'type': 'integer', 'title': 'Monthly Invocations'}, 'monthly_invocation_limit': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Monthly Invocation Limit'}}, 'additionalProperties': False}, 'MonthlyTokenUsage': {'type': 'object', 'title': 'MonthlyTokenUsage', 'properties': {'input_tokens': {'type': 'integer', 'title': 'Input Tokens', 'default': 0}, 'total_tokens': {'type': 'integer', 'title': 'Total Tokens', 'default': 0}, 'output_tokens': {'type': 'integer', 'title': 'Output Tokens', 'default': 0}}, 'additionalProperties': False}, 'CapabilityLimitUsage': {'type': 'object', 'title': 'CapabilityLimitUsage', 'required': ['used', 'limit', 'started_at', 'resets_at'], 'properties': {'used': {'type': 'integer', 'title': 'Used', 'minimum': 0}, 'limit': {'type': 'integer', 'title': 'Limit', 'minimum': 0}, 'period': {'type': 'string', 'const': 'calendar_month', 'title': 'Period', 'default': 'calendar_month'}, 'resets_at': {'type': 'string', 'title': 'Resets At', 'format': 'date-time'}, 'started_at': {'type': 'string', 'title': 'Started At', 'format': 'date-time'}}, 'additionalProperties': False}, 'PortfolioAlignmentOutput': {'type': 'object', 'title': 'PortfolioAlignmentOutput', 'required': ['capability', 'status', 'summary', 'meta'], 'properties': {'meta': {'$ref': '#/$defs/InvocationMeta'}, 'status': {'enum': ['compliant', 'non_compliant', 'insufficient_evidence'], 'type': 'string', 'title': 'Status'}, 'summary': {'type': 'string', 'title': 'Summary'}, 'findings': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'title': 'Findings'}, 'warnings': {'type': 'array', 'items': {'type': 'string'}, 'title': 'Warnings'}, 'capability': {'type': 'string', 'const': 'portfolio_alignment.v1', 'title': 'Capability'}, 'rule_results': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'title': 'Rule Results'}}, 'additionalProperties': False}, 'CapabilityLimitExceededOutput': {'type': 'object', 'title': 'CapabilityLimitExceededOutput', 'required': ['code', 'status', 'message', 'capability', 'plan', 'usage', 'resolution_paths'], 'properties': {'code': {'type': 'string', 'const': 'capability_limit_exceeded', 'title': 'Code'}, 'plan': {'type': 'string', 'title': 'Plan'}, 'usage': {'$ref': '#/$defs/CapabilityLimitUsage'}, 'status': {'type': 'string', 'const': 'quota_exceeded', 'title': 'Status'}, 'message': {'type': 'string', 'title': 'Message'}, 'capability': {'type': 'string', 'title': 'Capability'}, 'retryable_now': {'type': 'boolean', 'const': False, 'title': 'Retryable Now', 'default': False}, 'resolution_paths': {'type': 'array', 'items': {'$ref': '#/$defs/CapabilityLimitResolutionPath'}, 'title': 'Resolution Paths', 'minItems': 1}, 'same_idempotency_key_reusable': {'type': 'boolean', 'const': True, 'title': 'Same Idempotency Key Reusable', 'default': True}}, 'additionalProperties': False}, 'CapabilityLimitResolutionPath': {'type': 'object', 'title': 'CapabilityLimitResolutionPath', 'required': ['id', 'label', 'description'], 'properties': {'id': {'type': 'string', 'title': 'Id', 'maxLength': 64, 'minLength': 1}, 'url': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Url', 'default': None}, 'label': {'type': 'string', 'title': 'Label', 'maxLength': 120, 'minLength': 1}, 'description': {'type': 'string', 'title': 'Description', 'maxLength': 500, 'minLength': 1}, 'available_at': {'anyOf': [{'type': 'string', 'format': 'date-time'}, {'type': 'null'}], 'title': 'Available At', 'default': None}}, 'additionalProperties': False}}, 'anyOf': [{'$ref': '#/$defs/PortfolioAlignmentOutput'}, {'$ref': '#/$defs/CapabilityLimitExceededOutput'}], 'title': 'PortfolioAlignmentToolOutput'}
Ajouté
calculate_portfolio_constraints
17 September 2026 12:39
Ajouté
evaluate_portfolio_alignment
17 September 2026 12:39