feat: add server_info tool for diagnostics and implement interactive CLI onboarding wizard for easier authentication
CI/CD Pipeline / Lint & Check (push) Successful in 10s
Deploy Website to S3 / deploy (push) Successful in 6s
CI/CD Pipeline / Publish to PyPI (push) Has been skipped
CI/CD Pipeline / Build & Push Docker Image (push) Successful in 1m19s

This commit is contained in:
2026-05-14 21:12:48 +02:00
parent 7c8061eeea
commit 6db9e87f96
7 changed files with 355 additions and 108 deletions
+106
View File
@@ -0,0 +1,106 @@
"""
Server Info Tool
Exposes server version, capabilities, and metadata as an MCP tool
so that LLM clients can query the server's current state.
"""
import importlib.metadata
import os
from datetime import datetime, timezone
from mcp.server.fastmcp import FastMCP
from mcp.types import EmbeddedResource, TextResourceContents
from strava_mcp_server.strava_client import StravaClient
def _get_version() -> str:
try:
return importlib.metadata.version("strava-mcp-server-hnrx")
except importlib.metadata.PackageNotFoundError:
return "dev"
def register(mcp: FastMCP, strava: StravaClient) -> None:
@mcp.tool(
name="get_server_info",
description=(
"Returns metadata about this MCP server instance: version, available tools, "
"transport mode, and connection status. Call this first to understand the "
"server's capabilities and current configuration."
),
)
async def get_server_info() -> list:
version = _get_version()
transport = os.getenv("MCP_TRANSPORT", "stdio")
host = os.getenv("HOST", "0.0.0.0")
port = os.getenv("PORT", "8000")
has_token = bool(os.getenv("STRAVA_REFRESH_TOKEN"))
queried_at = datetime.now(timezone.utc).isoformat()
# Human-readable summary
status = (
"✅ Authenticated" if has_token else "⚠️ Unauthenticated (no REFRESH_TOKEN)"
)
endpoint = f"http://{host}:{port}/mcp" if transport == "http" else "stdio"
markdown = f"""## Strava MCP Server
| Field | Value |
|---------------|-------------------------------|
| **Version** | `{version}` |
| **Transport** | `{transport}` → `{endpoint}` |
| **Status** | {status} |
| **Queried** | {queried_at} |
### Available Tool Categories
- 🏃 **Athlete** Profile, stats, heart rate zones
- 🚴 **Activities** List, detail, laps, streams, comments
- 🏆 **Segments** Popular segments, starred segments, efforts
- 🛣️ **Routes** Athlete routes
- 🏟️ **Clubs** Membership, club activities
- ⚙️ **Gear** Bikes and shoes with mileage
### Quick Links
- [Repository](https://git.hnrx.net/hnrx/strava-mcp-server)
- [Website](https://strava-mcp.web.s3.hnrx.net)
- [PyPI](https://pypi.org/project/strava-mcp-server-hnrx/)
"""
data = {
"server": "strava-mcp-server-hnrx",
"version": version,
"transport": transport,
"endpoint": endpoint,
"authenticated": has_token,
"queried_at": queried_at,
"tool_categories": [
"athlete",
"activities",
"segments",
"routes",
"clubs",
"gear",
],
"links": {
"repository": "https://git.hnrx.net/hnrx/strava-mcp-server",
"website": "https://strava-mcp.web.s3.hnrx.net",
"pypi": "https://pypi.org/project/strava-mcp-server-hnrx/",
},
}
import json
return [
{"type": "text", "text": markdown},
EmbeddedResource(
type="resource",
resource=TextResourceContents(
uri="strava://server/info",
mimeType="application/json",
text=json.dumps(data, indent=2),
),
),
]