# Cloud FinOps Skill & MCP

> Cloud cost + FinOps knowledge for AI agents: AWS/Azure/GCP optimisation, AI spend, waste playbooks.

- name: io.github.OptimNow/cloud-finops
- version: 1.42.0
- connection class: R0 (autonomous)
- trust: 94/100
- quality: 88/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.OptimNow%2Fcloud-finops
- tools: https://api.protogrid.dev/v1/servers/io.github.OptimNow%2Fcloud-finops/tools

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

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "cloud-finops": {
      "type": "http",
      "url": "https://mcp.optimnow.io/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 99
- freshness: 100
- provenance: 80
- drivers: +repository +namespace-matches-repo +reachable +uptime-99% +updated-6d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 88/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### 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: 93 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 4 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 6 of 6 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 2,957 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 3 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`: deps.dev does not know cloud-finops-mcp@1.42.0

- tools: 6, about 2,957 tokens to load them all
- tool set hash: a080ec4f73dc3b6ea1abaed4171a7502
- tools last changed: 2026-10-14T01:26:36.982Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.OptimNow/cloud-finops.svg)](https://protogrid.dev/servers/io.github.OptimNow/cloud-finops)
- 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-14 `list_playbooks` changed (description)
  - before: See every ready-made runbook for finding and fixing cloud waste: idle, orphaned and overprovisioned resources, egress surprises, schedule blindness and AI/ML inefficiency across AWS, Azure and GCP. Use this to discover which waste patterns have a runbook. When the question already names a provider, waste category, or confidence tier, call ``find_playbooks`` instead. Each playbook is a small (~80-130 line) runbook scoped to one waste pattern (e.g. ``aws-zombie-nat-gateway``, ``azure-orphan-disks``). Returns ``{"playbooks": [...], "total": N}`` where each entry includes ``name``, ``title``, ``scope`` (aws/azure/gcp/cross-cloud), ``service``, ``waste_category``, ``confidence`` (obvious/likely/possible), and ``approx_tokens`` - the same size hint the reference listing carries, so a multi-playbook answer can be budgeted before fetching.
  - after: See every ready-made runbook for finding and fixing cloud waste: idle, orphaned and overprovisioned resources, egress surprises, schedule blindness and AI/ML inefficiency across AWS, Azure and GCP. Use this to discover which waste patterns have a runbook. When the question already names a provider, waste category, or confidence tier, call ``find_playbooks`` instead. Each playbook is a small (~90-170 line) runbook scoped to one waste pattern (e.g. ``aws-zombie-nat-gateway``, ``azure-orphan-disks``). Returns ``{"playbooks": [...], "total": N}`` where each entry includes ``name``, ``title``, ``scope`` (aws/azure/gcp/cross-cloud), ``service``, ``waste_category``, ``confidence`` (obvious/likely/possible), and ``approx_tokens`` - the same size hint the reference listing carries, so a multi-playbook answer can be budgeted before fetching.
- 2026-10-14 `get_reference` changed (description)
  - before: Fetch the guidance on one FinOps topic - the billing mechanics, decision rules and worked examples behind a defensible answer - either whole or one section at a time. Use this when you need the actual content of one known reference, after ``list_references`` or ``find_references`` told you which one serves the question. Advisory questions (commitment sizing, chargeback design, allocation methodology) are served by the reference's decision rules and worked examples, which a summary does not carry. Pass ``section`` when the question is narrower than the file. The ``approx_tokens`` hint in the listing tells you when this matters: the provider pattern catalogues run past 25,000 tokens and are enumerated lists, so a question about S3 lifecycle wants one section of ``finops-aws-patterns``, not all of it. Omit ``section`` for the whole file when you need the cross-cutting reasoning. Args: name: Reference name as returned by ``list_references`` (e.g. ``"finops-aws"``, ``"finops-genai-capacity"``, ``"optimnow-methodology"``). section: Optional H2 or H3 heading to return on its own. Matched case-insensitively and partially against the headings, so a natural phrase works - ``"storage"``, ``"commitment decision tree"``. A heading's trailing count is ignored, so ``"storage optimization patterns"`` matches ``"Storage Optimization Patterns (28)"``. If it matches nothing you get the list of available headings back, not the whole file. Without ``section``, returns ``{"name": ..., "content": "...", "lines": N}`` where ``content`` is the file verbatim. With ``section``, returns ``{"name", "title", "section", "section_level", "partial": true, "content", "lines", "full_lines"}`` where ``content`` is that section prefixed by the reference's title, plus ``other_matching_sections`` when the phrase matched more than one heading. On a miss, returns ``{"error": ..., "suggestions": [...]}``. An unknown name gives up to three string-distance matches; an unmatched ``section`` gives ``available_sections`` - every heading in the file - so the retry is exact.
  - after: Fetch the guidance on one FinOps topic - the billing mechanics, decision rules and worked examples behind a defensible answer - either whole or one section at a time. Use this when you need the actual content of one known reference, after ``list_references`` or ``find_references`` told you which one serves the question. Advisory questions (commitment sizing, chargeback design, allocation methodology) are served by the reference's decision rules and worked examples, which a summary does not carry. Pass ``section`` when the question is narrower than the file. The ``approx_tokens`` hint in the listing tells you when this matters: the AWS pattern catalogue runs past 25,000 tokens and the pattern catalogues are enumerated lists, so a question about S3 lifecycle wants one section of ``finops-aws-patterns``, not all of it. Omit ``section`` for the whole file when you need the cross-cutting reasoning. Args: name: Reference name as returned by ``list_references`` (e.g. ``"finops-aws"``, ``"finops-genai-capacity"``, ``"optimnow-methodology"``). section: Optional H2 or H3 heading to return on its own. Matched case-insensitively and partially against the headings, so a natural phrase works - ``"storage"``, ``"commitment decision tree"``. A heading's trailing count is ignored, so ``"storage optimization patterns"`` matches ``"Storage Optimization Patterns (28)"``. If it matches nothing you get the list of available headings back, not the whole file. Without ``section``, returns ``{"name": ..., "content": "...", "lines": N}`` where ``content`` is the file verbatim. With ``section``, returns ``{"name", "title", "section", "section_level", "partial": true, "content", "lines", "full_lines"}`` where ``content`` is that section prefixed by the reference's title, plus ``other_matching_sections`` when the phrase matched more than one heading. On a miss, returns ``{"error": ..., "suggestions": [...]}``. An unknown name gives up to three string-distance matches; an unmatched ``section`` gives ``available_sections`` - every heading in the file - so the retry is exact.
- 2026-10-14 `list_references` changed (description)
  - before: See what FinOps guidance is available: billing mechanics, commitment strategy, allocation and chargeback, AI cost management, and per-provider cost handbooks (AWS, Azure, GCP, OCI, Databricks, Snowflake, ...). Use this to discover what the library covers before deciding what to fetch. When the question already names a FinOps domain, phase, persona or maturity, call ``find_references`` instead of scanning this full list. Returns a dict shaped ``{"references": [...], "total": N}`` where each entry includes ``name``, ``title``, a one-line ``description``, the discriminating FCP facets (``fcp_domain``, ``fcp_capability``, ``fcp_phases``, ``fcp_personas_primary``, ``fcp_maturity_entry``) and ``approx_tokens``. Read ``approx_tokens`` before fetching: the library runs from about 3,000 to over 25,000 tokens per file. Above roughly 10,000, prefer ``get_reference(name, section=...)`` and pull the part you need.
  - after: See what FinOps guidance is available: billing mechanics, commitment strategy, allocation and chargeback, AI cost management, and per-provider cost handbooks (AWS, Azure, GCP, OCI, Databricks, Snowflake, ...). Use this to discover what the library covers before deciding what to fetch. When the question already names a FinOps domain, phase, persona or maturity, call ``find_references`` instead of scanning this full list. Returns a dict shaped ``{"references": [...], "total": N}`` where each entry includes ``name``, ``title``, a one-line ``description``, the discriminating FCP facets (``fcp_domain``, ``fcp_capability``, ``fcp_phases``, ``fcp_personas_primary``, ``fcp_maturity_entry``) and ``approx_tokens``. Read ``approx_tokens`` before fetching: the library runs from about 2,000 to over 25,000 tokens per file. Above roughly 10,000, prefer ``get_reference(name, section=...)`` and pull the part you need.

Full history: https://api.protogrid.dev/v1/servers/io.github.OptimNow%2Fcloud-finops/changes

## Dependencies

- pypi cloud-finops-mcp@1.42.0: unknown

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0.

## Remotes

- https://mcp.optimnow.io/mcp (streamable-http, auth none, reachable true, uptime30d 0.9866667)

## Packages

- pypi cloud-finops-mcp@1.42.0

## Tools (6)

- `find_playbooks`: Finds the runbook for a specific cloud waste pattern, filtered by
    provider, service, waste category or detection confidence. Useful
    before answering a specific waste or cost-fix question: each runbook
    includes a tested detection query the user can run in their own
    account, so it also serves questions about the user's own resources.

    Use this for questions like "which VMs are running for nothing",
    "why is our NAT bill so high", "my NAT gateway processes 10TB to S3",
    "should I delete these old snapshots", "which of our RIs are about to
    expire", "what waste can we clean up safely without review" - anything
    that names a provider, a waste category, or how confident the
    detection needs to be before acting. Patterns
    covered include NAT gateways and VPC endpoints, expiring Savings
    Plans / RIs / reservations, snapshot sprawl, S3 lifecycle gaps, idle
    or stopped VMs, orphaned disks / public IPs / EBS volumes, GPU and
    SageMaker sizing, Kubernetes idle capacity, and schedule blindness.

    All filters are optional and combine with AND semantics. String matching
    is case-insensitive and exact. Examples:

    - ``find_playbooks(scope="aws")`` - all AWS-specific playbooks
    - ``find_playbooks(waste_category="idle")`` - every idle-resource pattern
    - ``find_playbooks(scope="cross-cloud", confidence="obvious")``

    Args:
        scope: ``"aws"``, ``"azure"``, ``"gcp"``, or ``"cross-cloud"``.
        service: Provider service exact-match (e.g. ``"AWS NAT Gateway"``).
        waste_category: ``"orphaned"``, ``"idle"``, ``"overprovisioned"``,
            ``"commitment-mismatch"``, ``"schedule-blindness"``,
            ``"modernization"``, ``"ai-ml-inefficiency"``, or ``"egress"``.
        confidence: ``"obvious"`` (single signal is enough),
            ``"likely"`` (two signals required), or ``"possible"``
            (needs human review). From the OptimNow three-tier confidence
            model in `finops-waste-detection-playbooks`.

    Returns ``{"filters": {...}, "playbooks": [...], "total": N}``. A query
    that matches nothing also returns `hint` and `valid_values`, so a typo is
    distinguishable from a genuine gap in coverage.
    
- `find_references`: Find which guidance serves a FinOps question - how to commit, size,
    allocate, charge back, forecast, or govern cloud and AI spend.

    Use this for questions like "how should we size Savings Plans",
    "what should Finance own in chargeback", "what does a Crawl-stage org
    tackle first" - anything that maps to FinOps Framework facets (domain,
    capability, phase, persona, maturity) - and you want only the
    references that serve it, instead of scanning the full list.

    All filters are optional and combine with AND semantics. String matching
    is case-insensitive and exact (not substring). Examples:

    - ``find_references(domain="Optimize Usage & Cost")``
    - ``find_references(phase="Optimize", persona="Engineering")``
    - ``find_references(persona="Engineering", persona_primary_only=True)``
    - ``find_references(capability="Rate Optimization")``
    - ``find_references(maturity="Crawl")``

    Args:
        domain: FinOps Framework domain (e.g. ``"Optimize Usage & Cost"``,
            ``"Quantify Business Value"``, ``"Manage the FinOps Practice"``).
        capability: FinOps capability (matches ``fcp_capability`` and
            ``fcp_capabilities_secondary``).
        phase: FinOps phase (``"Inform"``, ``"Optimize"``, ``"Operate"``).
        persona: Persona (matches ``fcp_personas_primary`` and
            ``fcp_personas_collaborating``).
        maturity: Entry maturity level (``"Crawl"``, ``"Walk"``, ``"Run"``).
        persona_primary_only: when True, ``persona`` matches only the primary
            list. Use it when the default match barely narrows the set -
            broad personas like Engineering collaborate on nearly every file,
            so filtering on collaboration is descriptive, not discriminating.
            ``persona="Engineering", persona_primary_only=True`` is the
            engineering reading list; the default is the everything-they-touch
            view.

    Returns ``{"filters": {...}, "references": [...], "total": N}``. A query
    that matches nothing also returns `hint` and `valid_values`, so a typo is
    distinguishable from a genuine gap in coverage.
    
- `get_playbook`: Fetch the step-by-step runbook for one specific waste pattern:
    symptoms, the detection queries to run, the fix, and the anti-pattern
    to avoid.

    Use this when the user asks how to detect, confirm, or fix one specific
    named waste pattern (zombie NAT gateway, snapshot sprawl, idle SageMaker
    endpoint, ...). It also serves questions about the user's own resources
    ("which of my X..."): the runbook's detection query is written to be run
    in the user's account, so the answer does not depend on access to that
    account.

    Args:
        name: Playbook slug as returned by ``list_playbooks`` (e.g.
            ``"aws-zombie-nat-gateway"``, ``"azure-orphan-disks"``,
            ``"cross-cloud-untagged-spend-drift"``).

    Returns ``{"name": ..., "title": ..., "content": "...", "lines": N}``.
    On miss, returns ``{"error": ..., "suggestions": [...]}`` with up to
    three string-distance matches so the caller can self-correct.

    A host with MCP Apps (SEP-1865) support may render this result via the
    linked ``ui://cloud-finops/playbook-viewer`` resource instead of showing
    the raw markdown.
    
- `get_reference`: Fetch the guidance on one FinOps topic - the billing mechanics,
    decision rules and worked examples behind a defensible answer - either
    whole or one section at a time.

    Use this when you need the actual content of one known reference,
    after ``list_references`` or ``find_references`` told you which one
    serves the question. Advisory questions (commitment sizing, chargeback
    design, allocation methodology) are served by the reference's decision
    rules and worked examples, which a summary does not carry.

    Pass ``section`` when the question is narrower than the file. The
    ``approx_tokens`` hint in the listing tells you when this matters: the
    AWS pattern catalogue runs past 25,000 tokens and the pattern catalogues
    are enumerated lists, so a question about S3 lifecycle wants one section of
    ``finops-aws-patterns``, not all of it. Omit ``section`` for the whole
    file when you need the cross-cutting reasoning.

    Args:
        name: Reference name as returned by ``list_references`` (e.g.
            ``"finops-aws"``, ``"finops-genai-capacity"``,
            ``"optimnow-methodology"``).
        section: Optional H2 or H3 heading to return on its own. Matched
            case-insensitively and partially against the headings, so a
            natural phrase works - ``"storage"``, ``"commitment decision
            tree"``. A heading's trailing count is ignored, so
            ``"storage optimization patterns"`` matches
            ``"Storage Optimization Patterns (28)"``. If it matches nothing
            you get the list of available headings back, not the whole file.

    Without ``section``, returns ``{"name": ..., "content": "...",
    "lines": N}`` where ``content`` is the file verbatim. With ``section``,
    returns ``{"name", "title", "section", "section_level", "partial": true,
    "content", "lines", "full_lines"}`` where ``content`` is that section
    prefixed by the reference's title, plus ``other_matching_sections`` when
    the phrase matched more than one heading.

    On a miss, returns ``{"error": ..., "suggestions": [...]}``. An unknown
    name gives up to three string-distance matches; an unmatched ``section``
    gives ``available_sections`` - every heading in the file - so the retry
    is exact.
    
- `list_playbooks`: See every ready-made runbook for finding and fixing cloud waste:
    idle, orphaned and overprovisioned resources, egress surprises,
    schedule blindness and AI/ML inefficiency across AWS, Azure and GCP.

    Use this to discover which waste patterns have a runbook. When the
    question already names a provider, waste category, or confidence tier,
    call ``find_playbooks`` instead.

    Each playbook is a small (~90-170 line) runbook scoped to one waste
    pattern (e.g. ``aws-zombie-nat-gateway``, ``azure-orphan-disks``). Returns
    ``{"playbooks": [...], "total": N}`` where each entry includes ``name``,
    ``title``, ``scope`` (aws/azure/gcp/cross-cloud), ``service``,
    ``waste_category``, ``confidence`` (obvious/likely/possible), and
    ``approx_tokens`` - the same size hint the reference listing carries, so a
    multi-playbook answer can be budgeted before fetching.
    
- `list_references`: See what FinOps guidance is available: billing mechanics, commitment
    strategy, allocation and chargeback, AI cost management, and per-provider
    cost handbooks (AWS, Azure, GCP, OCI, Databricks, Snowflake, ...).

    Use this to discover what the library covers before deciding what to
    fetch. When the question already names a FinOps domain, phase, persona
    or maturity, call ``find_references`` instead of scanning this full
    list.

    Returns a dict shaped ``{"references": [...], "total": N}`` where each
    entry includes ``name``, ``title``, a one-line ``description``, the
    discriminating FCP facets (``fcp_domain``, ``fcp_capability``,
    ``fcp_phases``, ``fcp_personas_primary``, ``fcp_maturity_entry``) and
    ``approx_tokens``.

    Read ``approx_tokens`` before fetching: the library runs from about 2,000
    to over 25,000 tokens per file. Above roughly 10,000, prefer
    ``get_reference(name, section=...)`` and pull the part you need.
    
