finops-framework-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@finops-framework-mcpassess our allocation capability maturity"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
finops-framework-mcp
An unofficial MCP server pair that gives AI assistants a structured, sourced interface to the FinOps Foundation's published guidance — the FinOps Framework (capabilities, maturity assessments, KPIs, personas) and the FOCUS billing-data specification — so an assistant answers FinOps questions with the Foundation's actual text and formulas instead of improvising.
Start here: the usage guide
aaronmsoto.github.io/finops-framework-mcp is a free, no-install walkthrough written for FinOps practitioners as much as engineers — nothing to configure, just click through. It explains what these two servers do and why, connects one to Claude in a couple of minutes, and works through four real worked examples (a showback report, a rate-optimization calculation, a Crawl-to-Walk maturity journey, and a live Q&A session) with every number and quote pulled from an actual run of these servers. See Documentation below for the full page list.
Related MCP server: cloud-finops-mcp
Why this exists
Ask an AI assistant "how mature is our Allocation practice?" or "which FOCUS columns feed Effective Savings Rate?" without this, and it will happily improvise a plausible-sounding answer. These two servers exist so it doesn't have to: every response is the FinOps Foundation's own published text and formulas, structured for an assistant to read, with the source URL and license attached to it. Anything these servers had to work out themselves — a KPI-to-FOCUS-column mapping, a computed KPI value, a cross-version diff — is clearly labeled UNOFFICIAL rather than presented as if the Foundation published it.
finops-framework-mcp (this package) covers the FinOps Framework: 6 Principles, 3 Phases, 4 Domains, 22 Capabilities (each with Crawl/Walk/Run maturity assessments, per-persona activities, and KPIs), 11 Personas, 5 Technology Categories, the Scopes concept, and an 88-entry KPI library.
finops-focus-mcp (published separately, see below) covers FOCUS — the standardized billing/usage data spec — pinned to a spec version (1.0 or 1.2) on every answer, so nothing gets blended across releases that actually changed a column's meaning.
tokenomics-overview-mcp (published separately from v0.2.0, see below) covers AI tokenomics from the Tokenomics Foundation: the Seven-Layer Stack, Big-T notation, prompt-cache metrics (Cache Hit Rate, Cache Cost Efficiency), consumption levers, and stated cross-links into the other two servers.
Both servers are read-only: there's no way for an AI agent to change your FinOps practice or your billing data through them, only to read published guidance about it. Both are also offline once installed — no network access at runtime, no telemetry, no external calls.
Quickstart
Both servers are published on npm —
finops-framework-mcp and
finops-focus-mcp — so there is
nothing to clone or build. Each ships its data artifact inside the package and runs
offline after install; Node >= 22 is the only requirement.
npx -y finops-framework-mcp(-y skips npx's first-run install prompt, which can hang non-interactive
MCP clients; pin a version with npx -y finops-framework-mcp@latest or
@0.1.)
or, from a clone:
npm install && npm run build && npm run serverClaude Code:
claude mcp add finops-framework -- npx -y finops-framework-mcpClaude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"finops-framework": {
"command": "npx",
"args": ["-y", "finops-framework-mcp"]
}
}
}The artifact directory defaults to the one packaged with the npm release
(data/framework); override with FINOPS_MCP_DATA or the first CLI
argument if you're running against a locally-refreshed artifact.
Surface (default, official-only): 11 read-only tools —
get_framework_info (entry point), search_framework, list_capabilities,
get_capability, get_maturity_assessment, get_kpis, assess_maturity_path,
map_personas, get_entity, get_maturity_model, get_changelog —
finops://framework/… resources for full documents, and 4 prompts
(explain-framework, assess-capability-maturity, plan-maturity-roadmap,
map-personas-to-capabilities).
How it's built
Three fully decoupled parts, so a content refresh never needs a code change:
crawler ──▶ data artifact ──▶ MCP server
(src/crawlers/framework) (data/framework/) (src/servers/framework)
fetch → parse → sanitize versioned JSON + resources + tools +
→ compose → derive markdown + JSON prompts over stdio
→ validate → diff → emit Schemas + manifestcontent/markdown/ is the canonical intermediate: the crawler composes
it from parsed HTML, and every JSON file is regenerated from that markdown
by an offline derive step (no network access) — so a schema or JSON-only
fix can be regenerated without recrawling finops.org. A re-crawl refreshes
the server with zero code changes; the server validates the artifact
against its schemas at startup and refuses to start on a bad artifact.
Out of the box this server is deliberately official-only: no invented
relationship graph between capabilities, no maturity levels beyond the
Foundation's Crawl/Walk/Run, no parsed-out assessment items. An early
capability relationship graph
(get_prerequisites/get_related) was built, evaluated, and deleted
outright — see .agents/specs/v1-official-only.md — because neither the
harvested nor the inferred edges cleared the accuracy bar. The only derived
content either server returns is the FOCUS server's KPI-to-column mappings,
computed KPI values, and cross-version diffs — each labeled official: false
with an in-text UNOFFICIAL banner.
Refreshing the data
npm run refresh # crawl (polite, cached, robots-honoring) → new artifact + diff reportNo changes on finops.org → byte-identical artifact, no version bump. Content
changes → semantic diff report (.cache/crawl-report/diff-report.md),
changelog entry, and a semver bump (patch = text edits, minor = entity
add/remove). A scheduled GitHub Actions workflow is provided at
docs/proposed/refresh-data.yml — .github/workflows/ is a protected path
in this repo, so the owner installs it:
git mv docs/proposed/refresh-data.yml .github/workflows/refresh-data.ymlUntil installed, scheduled refreshes are inactive. Note GitHub auto-disables cron workflows after ~60 days of repo inactivity.
Data versioning policy
Consumers pin a data version by pinning a git ref (tag/commit) of this repo;
tracking main floats to the latest merged refresh. manifest.json carries
data_version, schema_version, crawled_at, per-file sha256, and entity
counts; derived/changelog.json (also served as get_changelog /
finops://framework/meta/changelog) records what changed between versions.
Schema-breaking changes bump schema_version and require a server release.
License and attribution
Code: MIT (see LICENSE). Framework content in data/framework/** and
FOCUS specification content in data/focus/**: © FinOps Foundation /
FOCUS project contributors, CC BY 4.0, restructured/adapted — see
NOTICE.md for the required attribution and modification notices. FinOps™,
FinOps Foundation™, and FOCUS™ are trademarks of the FinOps Foundation;
this project is independent and not affiliated with or endorsed by the
FinOps Foundation.
Sibling server: finops-focus-mcp
A version-aware FOCUS specification MCP server (src/crawlers/focus,
src/servers/focus, data/focus/ — FOCUS 1.0 and 1.2) reusing
src/shared. It publishes separately as
packages/finops-focus-mcp (npm bin
finops-focus-mcp) with its own README, NOTICE, and registry manifest:
9 tools covering column/attribute lookup, normative requirements, search,
cross-version diffs, plus clearly-flagged unofficial KPI-to-FOCUS
mappings and sample-data KPI calculation.
Both servers are also deployable over Streamable HTTP via the bundled
Cloudflare Worker (src/workers/, endpoints /mcp/framework and
/mcp/focus — see docs/deploy-worker.md), and
demo/ is a static browser walkthrough that drives both servers
end-to-end through the Worker.
Sibling server: tokenomics-overview-mcp
An AI tokenomics MCP server (src/crawlers/tokenomics,
src/servers/tokenomics, data/tokenomics/) built on the same pipeline
from the Tokenomics Foundation's CC BY
pages: the Seven-Layer Tokenomics Stack, Big-T notation (T(n · k · a)),
the prompt cache explainer's two reference metrics with a
calculate_cache_metrics tool, consumption levers, personas, value
classification, and the FOCUS 1.5 AI-cost capabilities. Every answer states the
source's publication status (most are Working Drafts or Release
Candidates). get_crosslinks returns finops://framework/… and
focus://spec/… URIs for the two servers above, each backed by a quote
from the Foundation page. It publishes separately as
packages/tokenomics-overview-mcp;
design and spec: docs/designs/tokenomics-overview-mcp.html,
.agents/specs/tokenomics-overview-mcp.md.
The full prompts/resources/tools hierarchy of all three servers — names, args,
URIs, param defaults/limits — is generated from live MCP output at
docs/mcp-surface.md.
Documentation
docs/guide/ is the usage guide — seven
self-contained pages in which every number, quote, and transcript was
captured from a live probe of these servers or computed from the committed
sample data. It is also the published site: .github/workflows/pages.yml
deploys docs/guide/ — and only that directory — to
https://aaronmsoto.github.io/finops-framework-mcp/ on every push to main
that touches it (setup and smoke test in
docs/deploy-pages.md).
Page | What it covers |
Both servers side by side; install, Claude Code / Claude Desktop / | |
Data model, all 11 tools grouped by job, prompts and resources, pagination, an Anomaly Management demo | |
Version model, all 9 tools, | |
Understand Usage & Cost → Allocation + Reporting & Analytics → the FOCUS columns a showback needs → a report computed from the official sample | |
Capability → featured KPIs → FOCUS columns at 1.0 vs 1.2 → Effective Savings Rate on the official sample | |
A maturity journey to Walk-level Forecasting: official Crawl/Walk characteristics, KPIs, and the data that feeds a forecast | |
Four unscripted live prompts in one session: capabilities by domain, a capability summary, a Crawl→Walk maturity gap with validating KPIs, and starter Unit Economics KPIs from FOCUS 1.2 |
Every page opens over file:// too — the guide has no external assets.
Guide pages are rich HTML by design — an intentional exception to this
repo's markdown-for-docs convention, recorded in
.agents/memory/decisions.md.
Development
Agent instructions: AGENTS.md · design:
docs/architecture.md(adversarial reviews:docs/critique-1.md,docs/critique-2.md,docs/critique-3-publish-gate.md,docs/critique-4-focus-gate.md,docs/final-status-review.md)Gates:
./scripts/agentic gates· tests:npm test(fixture-based, no network) · evals:evals/framework/(docs/eval-results.md)Working in a clone: the checked-in
.mcp.jsonloads both servers into MCP clients that read it, running the published packages vianpxso a fresh clone works with no build. To exercise your working tree instead,cp .mcp.json.example .mcp.jsonand build first (dist/is gitignored), then restart the client — clients read MCP config only at startup. See CONTRIBUTING.md.
Available Tools
11 toolsassess_maturity_pathMaturity gap between two levelsARead-onlyIdempotent
For one capability, the official maturity assessment text at each level between current and target — evidence to look for when maturing. To get one level's assessment text on its own (or all three at once), use get_maturity_assessment instead.
| Name | Required | Description | Default |
|---|---|---|---|
| capability | Yes | Capability slug, e.g. 'allocation' | |
| target_level | Yes | Ending maturity level, inclusive — must be above current_level | |
| current_level | Yes | Starting maturity level, exclusive — the gap begins above this |
Output Schema
| Name | Required | Description |
|---|---|---|
| gap | Yes | |
| capability | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and closed-world behavior, so the safety profile is covered. The description adds useful content semantics ('evidence to look for when maturing') but says nothing about ordering, empty-range handling, or size of the returned text; with annotations carrying the safety burden, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the primary behavior front-loaded and the sibling disambiguation placed second. Nothing redundant with the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained; params are fully documented at 100% coverage; annotations cover the read-only/idempotent profile. Combined with the explicit sibling routing, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both level parameters are enums with inclusive/exclusive semantics already documented in the schema. The description reinforces the range concept ('between current and target') but adds no format or constraint detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: returns the official maturity assessment text at each level between a current and target level, for one capability. It also explicitly distinguishes itself from the sibling get_maturity_assessment, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (get_maturity_assessment) and the exact conditions that select it — one level alone, or all three at once — making this tool's niche (a contiguous range/gap) unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_capabilityGet one capabilityARead-onlyIdempotent
One capability's content, section-selectable via include to control size. Default include is [summary, definition] (~1-2k tokens). Approximate extra cost per section: maturity ~2.5k tokens, activities ~3k (filter with persona), kpis ~1k, headline_groups/inputs_outputs <1k; requesting ALL sections is roughly 7k tokens — prefer the finops://framework/capabilities/{slug} resource for the full document.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Sections to return (default [summary, definition]) | |
| persona | No | With include:['activities']: return only this persona's activities | |
| capability | Yes | Capability slug, e.g. 'allocation' |
Output Schema
| Name | Required | Description |
|---|---|---|
| uri | Yes | |
| slug | Yes | |
| title | Yes | |
| domain | Yes | |
| license | Yes | |
| sections | Yes | |
| source_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a safe, idempotent read; the description goes well beyond that by disclosing default output size (~1-2k tokens), per-section token costs, the ~7k cost of requesting everything, and the cheaper resource alternative. This is exactly the cost/limit context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded, leading with what is returned and the default before the cost breakdown. Every clause about token cost or the resource alternative earns its place, though the single packed paragraph is heavier than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described; the description covers defaults, cost tradeoffs, filtering, and an alternative access path. For a 3-parameter read tool this leaves no meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it quantifies each `include` section's token cost and explains that `persona` only applies when `activities` is included. That materially helps an agent choose values rather than just knowing the types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: fetches one capability's content, and makes the section-selectable behavior explicit. An agent can immediately tell this is a targeted single-capability retrieval rather than a list or search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance (default sections, per-section cost) and an explicit when-not/alternative: prefer the capability resource for the full document. The `persona` filter condition is also stated. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_changelogData changelogARead-onlyIdempotent
What changed between data versions of this server's crawled artifact (rolling window of the 20 most recent refreshes — the crawler caps the log at 20, so this tool covers the full retained history; the same data is at finops://framework/meta/changelog). Reflects crawl-to-crawl differences in finops.org content, not a Foundation-published changelog.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| entries | Yes | |
| current_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-open-world), but the description adds real behavioral context: the crawler caps the log at 20 refreshes, so the tool covers the full retained history rather than a truncated slice. That retention/cap behavior is exactly the kind of trait annotations cannot express, though it says nothing about ordering or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two front-loaded sentences that lead with the core purpose before qualifying scope and the mirroring resource URI. The long parenthetical is information-dense rather than wasteful, though it slightly buries the retention fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is unnecessary, and the description covers purpose, retention window, scope caveat, and alternate access path. The one gap is that the only input parameter is undocumented in both the schema and the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single `limit` parameter has 0% schema description coverage and is never named in the description, so its role (number of entries returned) and default of 5 are left implicit. The description does partially compensate by explaining the 20-entry cap, which gives the schema's maximum=20 meaning, but it never connects that to the `limit` argument itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: what changed between data versions of the server's crawled artifact, scoped to crawl-to-crawl differences in finops.org content. It explicitly disambiguates from a Foundation-published changelog, so the agent knows exactly what this returns and that no sibling tool covers this ground.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when this applies (checking crawl-to-crawl diffs in the retained history) and rules out a common misreading ('not a Foundation-published changelog'), plus points to the equivalent resource at finops://framework/meta/changelog. It stops short of an explicit when-to-use/when-not rule against sibling tools, but no sibling offers changelog data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entityGet full text of a small framework entityARead-onlyIdempotent
Full rendered markdown for entity types that have no dedicated tool. Required param: entity_type (principles | phases | domains | technology-categories | scopes | persona). Collections return whole (they are small); entity_type 'persona' also needs slug. For capabilities use get_capability; for KPIs get_kpis; for maturity levels get_maturity_model.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Required for entity_type 'persona'; ignored otherwise | |
| entity_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| uri | Yes | |
| slug | No | |
| markdown | Yes | |
| entity_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds useful behavior beyond that: collections are returned whole because they are small, and persona additionally requires a slug. It doesn't discuss pagination or failure modes, but with annotations plus an output schema those are lower priority.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences that front-load the return type before stating requirements and alternatives. Slightly dense, but every clause carries information; no filler and no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return format need not be described, and the description covers everything else an agent needs: what is returned, the valid entity types, the required parameter, the persona special case, and the sibling routing. Nothing essential is missing for a two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% — the enum values carry no per-value documentation there — so the description earns its keep by listing all six valid entity_type values and specifying the conditional requirement of slug for 'persona'. That conditional logic is not present in the schema and materially affects a correct call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what is returned (full rendered markdown) and scopes it to entity types that have no dedicated tool, enumerating them explicitly. It explicitly distinguishes itself from sibling tools by naming get_capability, get_kpis, and get_maturity_model as the correct routes for other entity types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives both the when ('entity types that have no dedicated tool') and the when-not with concrete alternatives ('For capabilities use get_capability; for KPIs get_kpis; for maturity levels get_maturity_model'). The routing decision is fully determined without opening any schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_framework_infoFramework & server orientationARead-onlyIdempotent
Start here. Returns the framework's structure (entity counts), the data version/crawl date/license, and how to navigate this server's tools. No parameters.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| counts | Yes | |
| license | Yes | |
| crawled_at | Yes | |
| overview_md | Yes | |
| data_version | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety and side-effect profile is fully covered without description help. The description adds the useful scope fact that the response includes data version and license metadata, but says nothing about freshness guarantees or size of the payload beyond what the output schema supplies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the routing instruction 'Start here' before the content list, and zero filler. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema and full annotation coverage, the description supplies what the schema cannot: its role as the server entry point and the fact that it teaches navigation of the other tools. It omits any mention of sibling relationships or follow-up actions, which would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters and 100% schema coverage, the baseline is 4. The explicit 'No parameters.' statement confirms the tool is a no-argument call, adding small but real clarity for an agent deciding whether it needs to gather inputs first.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (the framework) and enumerates exactly what is returned: entity counts, data version/crawl date/license, and tool navigation guidance. 'Start here' plus the navigation clause distinguishes it from data-retrieval siblings like search_framework and get_entity, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Start here' is an explicit when-to-use instruction that positions the tool as the entry point before the other ten siblings. It gives no when-not-to-use or fallback condition, but for an orientation tool the single directive is clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_kpisGet KPIs (full records)ARead-onlyIdempotent
Full KPI records: description, formula + candidate data sources (present for the 44 KPIs the site details in capability-page popups), official related capabilities, and where each is featured. Look up one KPI with slug, or filter by capability and/or featured_only — filters combine (AND), so a slug that doesn't match the capability filter returns zero records. Without filters, pages through the whole 88-entry library.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Exact KPI slug for a single-record lookup, e.g. 'allocation-accuracy-index-aai' | |
| limit | No | ||
| cursor | No | ||
| capability | No | Only KPIs featured on or officially related to this capability | |
| featured_only | No | With `capability`: only KPIs featured on that capability's own page; alone: only KPIs featured on some page |
Output Schema
| Name | Required | Description |
|---|---|---|
| kpis | Yes | |
| total | Yes | |
| nextCursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, closed-world behavior, so the bar is lower. The description adds genuinely useful context beyond them: that formula and data-source fields exist only for the 44 detailed KPIs (partial data, not an error), that the library is 88 entries, and that unfiltered calls paginate through the entire set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very tight — every clause carries information (data availability, lookup mode, filter logic, pagination scope) and the record contents are front-loaded. The heavy backtick-per-parameter style makes it slightly dense to parse, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover the safety profile. The description covers data completeness caveats, filter combination, and pagination scope, leaving only the mechanics of `limit`/`cursor` continuation slightly implicit. Adequate for a 5-param, no-required-args read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60% and the description fills key gaps: it defines slug as exact-match lookup, explains capability as 'featured on or officially related to', and clarifies featured_only's dual meaning with and without capability. It also explains filter interaction (AND) and the resulting empty result set. `limit` and `cursor` remain undocumented in both places, costing a point.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (look up / filter / page through) and resource (full KPI records), and enumerates exactly what a record contains: description, formula plus candidate data sources, related capabilities, and featured locations. That level of content specification lets an agent distinguish it from sibling list/detail tools like list_capabilities and get_capability without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the two usage modes — single-record lookup via `slug` versus filtered/paged browsing — and explains the AND combination rule plus the zero-record gotcha when a slug conflicts with a capability filter. It does not, however, point to any sibling tool for adjacent needs (e.g., when to use get_capability instead), so it stops short of explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_maturity_assessmentGet official maturity assessmentARead-onlyIdempotent
The official FinOps Framework maturity assessment prose for a capability, verbatim, at one level (crawl|walk|run) or all three. This is the Foundation's published assessment text, not a parsed breakdown.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | One level; omit for all three official levels | |
| capability | Yes | Capability slug, e.g. 'allocation' |
Output Schema
| Name | Required | Description |
|---|---|---|
| levels | Yes | |
| capability | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, closed-world behavior, so the safety profile is covered. The description adds genuinely useful context about the nature of the payload — verbatim official published text rather than a normalized/parsed representation — which shapes how an agent should present or trust the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the most decision-relevant information (what it returns, its verbatim character, the level scoping) front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations cover the behavioral profile. The description is complete enough for a simple two-parameter read; only a direct pointer to the alternative assessment tool would improve it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the enum values and the 'omit for all three' behavior are already documented in the input schema. The description repeats the level vocabulary but adds no slug syntax or format detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('get the official FinOps Framework maturity assessment prose for a capability') and pins the scope precisely (one level or all three). The clause 'not a parsed breakdown' separates it from derived-text siblings like get_maturity_model, so an agent can choose without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The contrast with 'a parsed breakdown' implies when to prefer this tool over an interpretive one, but no sibling is named and there is no explicit when/when-not guidance relative to get_maturity_model or assess_maturity_path. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_maturity_modelGet the maturity modelARead-onlyIdempotent
The official FinOps maturity model: Crawl/Walk/Run with each level's characteristics and the community's sample goals/KPIs (e.g. allocation coverage targets per level). Capability-agnostic — for one capability's per-level assessment use get_maturity_assessment.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| official_levels | Yes | |
| unofficial_extension | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-open-world, so safety is covered. The description adds useful scope context beyond the annotations: this is the static, capability-agnostic reference model rather than a scoped assessment, and it hints at the content (per-level characteristics, sample KPIs like allocation coverage targets). It stops short of describing depth or shape of the returned data, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste: the first defines the resource and its content, the second routes to the sibling. Front-loaded and appropriately sized for a zero-parameter reference lookup.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present, and annotations covering the safety profile, the description only needed to establish what the model is and how it differs from the assessment sibling — both done. Nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters and the schema is empty, so there is nothing for the description to disambiguate. Baseline 4 applies; the description correctly signals a no-argument lookup rather than implying hidden filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (the official FinOps maturity model) and its structure (Crawl/Walk/Run levels with characteristics and sample goals/KPIs). It also explicitly distinguishes itself from the sibling get_maturity_assessment by declaring itself capability-agnostic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule: use this for the overall model, use get_maturity_assessment for a single capability's per-level assessment. The when-not condition and the alternative tool are both named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_capabilitiesList capabilitiesARead-onlyIdempotent
All 22 capabilities (slug, title, domain, one-line summary), optionally filtered by domain and/or persona (both take a slug, e.g. domain="understand-usage-and-cost", persona="finance"). The framework does not assign capabilities to phases, so there is deliberately no phase filter. Default limit returns the full list in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| domain | No | Domain slug, e.g. 'understand-usage-and-cost' | |
| persona | No | Persona slug, e.g. 'finance' |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| total | Yes | |
| nextCursor | No | |
| capabilities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint=false), so the bar is lower. The description still adds real context: the default limit returns the entire list in one call, and the absence of a phase filter is explained as intentional rather than an oversight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the resource and its fields, then filters, then the intentional-omission note. The phase sentence earns its place by preventing a false expectation of a phase parameter, though the block is slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still names the fields returned. Combined with the filter semantics and the full-list default, an agent has nearly everything needed to call this correctly; only cursor pagination behavior is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% — limit and cursor have no descriptions — but the description partially compensates by clarifying that the default limit returns the full list, implying pagination is usually unnecessary. The domain and persona examples largely duplicate schema descriptions, so overall value above the schema is moderate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (capabilities), gives the exact count (22), and enumerates the returned fields (slug, title, domain, summary). It is clearly distinguishable from the singular sibling get_capability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains that domain and persona filters are optional, gives concrete slug examples, and preempts an obvious wrong assumption by stating there is deliberately no phase filter. It lacks explicit routing to siblings such as search_framework or get_capability, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
map_personasPersona ↔ capability mappingARead-onlyIdempotent
With persona: every capability that persona works in, WITH that persona's activity bullets inline (one call answers 'what does X do across the framework'). With capability: every persona active in it, with activities. With neither: the full persona index (slugs, categories) — use it to discover persona slugs. Passing both is an error — pick one direction per call. Allied personas are mapped at group level by the framework; responses say so explicitly.
| Name | Required | Description | Default |
|---|---|---|---|
| persona | No | Persona slug, e.g. 'finance' | |
| capability | No | Capability slug, e.g. 'allocation' |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| note | No | |
| entries | No | |
| license | Yes | |
| personas | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and closed-world, so the safety profile is covered. The description adds behavior beyond them: mutual exclusivity is an error, and allied personas are mapped at group level by the framework with responses stating that explicitly — a real output nuance. It does not cover limits, pagination, or behavior on an unknown slug, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded by mode (persona, capability, neither), with the error rule stated before the edge-case note about allied personas. Dense with parentheticals but each sentence carries distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-shape details are not required, and the description still flags the group-level allied-persona caveat. Both parameters, the mutually exclusive case, and the discovery path are all covered. Only minor gaps remain, such as behavior on an unrecognized slug.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema cannot: each parameter selects a direction of the mapping and changes what is returned (inline activity bullets vs. persona list), and the two are mutually exclusive. That is genuine semantic value on top of the slug descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource and defines exactly what each mode returns: 'every capability that persona works in, WITH that persona's activity bullets inline' versus 'every persona active in it, with activities'. It also covers the zero-argument case ('the full persona index'), so all three behaviors are distinguishable. It stops short of naming sibling tools, so an agent must infer the boundary against get_capability/list_capabilities on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing for every mode: persona for 'what does X do across the framework', capability for the reverse direction, neither 'to discover persona slugs'. It also states the negative constraint outright — 'Passing both is an error — pick one direction per call' — which no schema or annotation conveys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_frameworkSearch the frameworkARead-onlyIdempotent
Ranked keyword search over every entity (capabilities, KPIs, personas, principles, phases, domains, technology categories, maturity levels, scopes). Returns slug + uri per hit. Feed the slug to get_kpis(slug: …), or pass it as capability: <slug> to get_capability/get_maturity_assessment/assess_maturity_path/map_personas and as persona: <slug> where a persona filter is accepted. Other entity types (principles, phases, domains, technology categories, scopes) are read via get_entity(entity_type: …) or the hit's finops:// resource uri. Use this whenever you don't already know a slug.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Keywords, e.g. 'unallocated spend tagging' | |
| cursor | No | Opaque cursor from a previous call | |
| entity_types | No | Restrict to these entity types (default: all) |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes | |
| nextCursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered. The description still adds real context beyond that: results are ranked, each hit returns slug + uri, and those slugs are the keys expected by get_kpis, get_capability, get_maturity_assessment and map_personas. It does not mention pagination/cursor behavior, which the schema handles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the 'don't know a slug' trigger, then a dense but useful routing block. The long parenthetical enumeration of entity types and the multi-tool routing sentence are justified by the breadth of the tool, though they make it run long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still supplies the highest-value return fact (slug + uri) and how to use it. Combined with the routing guidance, an agent has enough to call the tool and act on results; only pagination semantics are left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, so query, cursor and entity_types are already documented in the schema. The description enumerates the entity types in prose but adds no syntax, format, or default details for limit/cursor/entity_types. Baseline 3 is appropriate when the schema does most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Ranked keyword search over every entity') and enumerates exactly which entity types are covered, so an agent knows the search spans the whole framework rather than one collection. It is clearly distinguishable from siblings like list_capabilities or get_entity, which return single collections/types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('whenever you don't already know a slug') and names the alternative routes for the other entity types ('read via get_entity(entity_type: …) or the hit's finops:// resource uri'). It then spells out the concrete downstream calls each slug feeds, which is the exact routing decision an agent faces here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.2.0- First observed
assess_maturity_path - First observed
get_capability - First observed
get_changelog - First observed
get_entity - First observed
get_framework_info - First observed
get_kpis - First observed
get_maturity_assessment - First observed
get_maturity_model - First observed
list_capabilities - First observed
map_personas - First observed
search_framework
TDQS
Scored across 11 tools
Most tools target distinct entity types or actions, and descriptions explicitly steer users (e.g., get_maturity_assessment vs assess_maturity_path vs get_maturity_model). The maturity trio has some conceptual overlap, but the prose clarifies when to use each.
All names use consistent snake_case with clear verb_noun structure (get_*, list_*, search_*, assess_*, map_*). The pattern is predictable across the entire tool set.
11 tools is well within the ideal 3-15 range for a multi-entity framework browser. Each tool corresponds to a distinct entity type or workflow, with no excessive fragmentation.
The surface covers discovery, capabilities, KPIs, personas, maturity assessment/path/model, generic entities (principles, phases, domains, technology categories, scopes), and changelog. This is comprehensive read-only coverage for the FinOps Framework domain.
Maintenance
Related MCP Connectors
- OKForestOAuthai.okforest
Your organization's knowledge as OKF trees in Git, for AI assistants to search, read, and cite
- KumbukaOAuthai.kumbuka
Governed, auditable knowledge your team curates for its AI assistants, self-hostable
Read-only, deterministic AI triage and readiness tools implementing Sophon's published rubrics.
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to query multi-cloud cost and usage data through a uniform read-only toolset, including cost summaries, trends, budgets, forecasts, and optimization recommendations.MIT
- AlicenseAqualityAmaintenanceEnables MCP-compatible AI clients to retrieve FinOps-aligned knowledge and runbooks on demand, covering cloud cost optimization across AWS, Azure, GCP, and OCI, AI inference economics, Kubernetes, data platforms, allocation, chargeback, anomaly management, and waste detection.663CC BY-SA 4.0
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to analyze AWS cloud costs, audit for waste, monitor budgets, and generate FinOps reports using natural language across multiple AWS profiles and regions, while keeping credentials on the local machine.-
- AlicenseNot gradedqualityCmaintenanceEnables an AI assistant to retrieve IT system status and search or rebuild a vector-indexed knowledge base of operational runbooks. It supports local, tool-grounded responses over stdio for Ollama-based agents, helping prevent hallucinated IT operations guidance.MIT