MCP server for Finout cloud cost observability platform
Project description
Finout MCP Server
Model Context Protocol server for Finout cloud cost observability. Query costs, detect anomalies, and find waste using natural language.
Quick Start
# Install
pip install finout-mcp-server
# Configure
cat > ~/.config/claude/claude_desktop_config.json <<EOF
{
"mcpServers": {
"finout": {
"command": "finout-mcp",
"args": [],
"env": {
"FINOUT_API_URL": "https://app.finout.io",
"FINOUT_CLIENT_ID": "your-client-id",
"FINOUT_SECRET_KEY": "your-secret-key"
}
}
}
}
EOF
# Restart Claude Desktop
Hosted Public Service
Run MCP over Streamable HTTP (separate from VECTIQOR):
finout-mcp-hosted-public
Authentication for hosted requests:
- Send
x-finout-client-idandx-finout-secret-keyheaders on MCPPOSTcalls. - Optional override:
x-finout-api-url(defaults tohttps://app.finout.io).
Defaults:
MCP_HOST=0.0.0.0MCP_PORT=8080- MCP endpoint:
POST/GET /mcp - Health endpoint:
GET /health
Environment Variables
| Variable | Required | Description |
|---|---|---|
FINOUT_API_URL |
No | API endpoint (https://app.finout.io for public mode) |
FINOUT_CLIENT_ID |
Yes in public mode |
API client ID |
FINOUT_SECRET_KEY |
Yes in public mode |
API secret key |
Get credentials from your Finout account settings.
Tools
Cost Analysis:
query_costs- Query costs with filters and groupingcompare_costs- Period-over-period comparison
Filter Discovery:
list_available_filters- Browse available filterssearch_filters- Search filters by keywordget_filter_values- Get values for a specific filter
Optimization:
get_anomalies- Detect cost spikesget_waste_recommendations- Find idle resources
Example Queries
"What was my AWS spend last month?"
"Show me EC2 costs in us-east-1 for last week"
"Compare this month's Kubernetes costs to last month"
"Find idle resources that could save money"
"Show cost anomalies from the past 7 days"
Usage Pattern
Most cost queries follow this pattern:
- Search for relevant filters:
search_filters("service") - Get filter values if needed:
get_filter_values(...) - Query costs with filters:
query_costs(time_period, filters, group_by)
Example:
# Find service filter
filters = search_filters("service")
# Query EC2 costs
costs = query_costs(
time_period="last_30_days",
filters=[{
"costCenter": "aws",
"key": "service",
"type": "tag",
"operator": "is",
"value": "ec2"
}]
)
Filter Structure
Filters require these fields from search results:
{
"costCenter": "aws", # From search results
"key": "service", # From search results
"type": "tag", # From search results
"path": "AWS/Services", # From search results
"operator": "is", # "is" for single value, "oneOf" for array
"value": "ec2" # Your filter value
}
IMPORTANT: Always use search_filters first to get the exact type value. Don't guess.
Development
# Install dependencies
uv sync
# Run tests
uv run pytest
# Start locally
uv run python -m finout_mcp_server
Troubleshooting
"Internal API URL not configured"
- Set
FINOUT_API_URLin your environment (optional; defaults tohttps://app.finout.io)
"No matches found" when searching filters
- Use broader search terms (e.g., "service" instead of "ec2")
- Try different cost centers: "aws", "gcp", "kubernetes", "virtual-tag"
Filter values not showing up
- Use
get_filter_values()to fetch values on-demand - Values are lazy-loaded to avoid overwhelming context
Query returns no data
- Check date range is valid
- Verify filter values exist using
get_filter_values() - Check operator: use "is" for single value, "oneOf" for array
Resources
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file finout_mcp_server-0.1.2.tar.gz.
File metadata
- Download URL: finout_mcp_server-0.1.2.tar.gz
- Upload date:
- Size: 109.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08b756fefc0f235e7c1e66b650b96c7a1d8f2cb270985524d786aa5d9a02a82c
|
|
| MD5 |
d89970cc0d109ca8e477d7cd8845c5cf
|
|
| BLAKE2b-256 |
408b12d86cebf6e1932af2b5ce98a74466145735079ea1f6dc14a591ba8d60bc
|
File details
Details for the file finout_mcp_server-0.1.2-py3-none-any.whl.
File metadata
- Download URL: finout_mcp_server-0.1.2-py3-none-any.whl
- Upload date:
- Size: 53.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e127d6c123461239ecfde896238b8a3144520abf3e390254a19c83ebcd80f63f
|
|
| MD5 |
78b56a6fcd97fa639e763aa746d3800d
|
|
| BLAKE2b-256 |
242262e70c7d7e227d2e7eefaeb9a82d82231f52e6a0460198ba4ce6e8e449c1
|