# PortfolioFit

> Check normalized portfolios against mandates and calculate allocation constraints.

- name: fit.portfolio/portfoliofit
- version: 0.1.3
- connection class: R0 (autonomous)
- trust: 79/100 flags: no-repository
- quality: 90/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/fit.portfolio%2Fportfoliofit
- tools: https://api.protogrid.dev/v1/servers/fit.portfolio%2Fportfoliofit/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "portfoliofit": {
      "type": "http",
      "url": "https://portfolio.fit/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 99
- freshness: 85
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-97% ~updated-79d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 90/100 (strong)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 100 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 10 of 10 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 5,529 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 75 (weight 15)

- warn `stability.changes`: 10 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 10, about 5,529 tokens to load them all
- tool set hash: ba6b18a24b06d1dc4cc89dc3064b4b0b
- tools last changed: 2026-10-10T19:36:51.822Z
- badge: [![protogrid quality](https://protogrid.dev/badge/fit.portfolio/portfoliofit.svg)](https://protogrid.dev/servers/fit.portfolio/portfoliofit)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-10 `calculate_portfolio_statistics` added
  - Calculate historical return, volatility, drawdown, risk-adjusted and benchmark-relative statistics from a confirmed portfolio series profile. The metrics parameter describes all available calculations and their required inputs. Use daily, weekly or monthly complete periods; results include coverage, warnings and exact dataset/profile pins. Reuse an idempotency_key only for an identical calculation.
- 2026-10-10 `review_portfolio_series_profile` added
  - Create an immutable profile revision using revise, or explicitly confirm a warning-free proposal with confirmation=true.
- 2026-10-10 `cancel_portfolio_series_upload` added
  - Cancel a pending upload and permanently remove its staging chunks.
- 2026-10-10 `upload_portfolio_series_rows` added
  - Upload normalized series_key/date/value/distribution rows and commit a dataset version. For up to 5,000 rows, omit chunk_index and total_chunks to complete in one call. For larger inputs, declare total_chunks on every call, send chunks in order, and reuse upload_id and idempotency_key. The final chunk automatically verifies and commits all data and returns immutable series profiles. Parse files locally before calling.
- 2026-10-10 `calculate_portfolio_constraints` changed (inputSchema, outputSchema)
- 2026-10-10 `evaluate_portfolio_alignment` changed (inputSchema, outputSchema)
- 2026-10-10 `get_analysis` added
  - Read retained normalized inputs, operations, results and owner-scoped dataset references. This is not an external agent transcript.
- 2026-10-10 `list_analyses` added
  - Read private calculation groups and independent operations. Filter by kind, portfolio, dates, ready/running/attention status or legacy open/finished status.
- 2026-10-10 `list_portfolio_series` added
  - Discover owner-scoped immutable series profiles and their exact dataset versions. This returns metadata and coverage only, never dataset rows.
- 2026-10-10 `list_analysis_portfolios` added
  - List owner-scoped portfolios, analytics datasets, and profile readiness.

Full history: https://api.protogrid.dev/v1/servers/fit.portfolio%2Fportfoliofit/changes

## Remotes

- https://portfolio.fit/mcp (streamable-http, auth none, reachable true, uptime30d 0.9655172)

## Packages

_none_

## Tools (10)

- `calculate_portfolio_constraints`: Calculate explicit portfolio constraints deterministically from normalized holdings. Use this for arithmetic checks, not for interpreting natural-language mandates.
- `calculate_portfolio_statistics`: Calculate historical return, volatility, drawdown, risk-adjusted and benchmark-relative statistics from a confirmed portfolio series profile. The metrics parameter describes all available calculations and their required inputs. Use daily, weekly or monthly complete periods; results include coverage, warnings and exact dataset/profile pins. Reuse an idempotency_key only for an identical calculation.
- `cancel_portfolio_series_upload`: Cancel a pending upload and permanently remove its staging chunks.
- `evaluate_portfolio_alignment`: Compare a clean mandate with normalized holdings. Do not send PDF, CSV, spreadsheet, or factsheet files; extract them before calling.
- `get_analysis`: Read retained normalized inputs, operations, results and owner-scoped dataset references. This is not an external agent transcript.
- `list_analyses`: Read private calculation groups and independent operations. Filter by kind, portfolio, dates, ready/running/attention status or legacy open/finished status.
- `list_analysis_portfolios`: List owner-scoped portfolios, analytics datasets, and profile readiness.
- `list_portfolio_series`: Discover owner-scoped immutable series profiles and their exact dataset versions. This returns metadata and coverage only, never dataset rows.
- `review_portfolio_series_profile`: Create an immutable profile revision using revise, or explicitly confirm a warning-free proposal with confirmation=true.
- `upload_portfolio_series_rows`: Upload normalized series_key/date/value/distribution rows and commit a dataset version. For up to 5,000 rows, omit chunk_index and total_chunks to complete in one call. For larger inputs, declare total_chunks on every call, send chunks in order, and reuse upload_id and idempotency_key. The final chunk automatically verifies and commits all data and returns immutable series profiles. Parse files locally before calling.
