feat: add server_info tool for diagnostics and implement interactive CLI onboarding wizard for easier authentication
This commit is contained in:
@@ -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),
|
||||
),
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user