Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Descripción del creador (original en inglés)
MCP server for the Open Telekom Cloud Price Calculator API (eu-de, eu-nl, eu-ch2).
Estos tres nunca se combinan en una sola puntuación: las opiniones, las mediciones y la popularidad son cosas distintas.
Todavía no escribimos un resumen sencillo para este. Abajo están los datos que leímos del registro.
Elige la app de IA que usas y copia la configuración.
Necesitas
¿Qué app usas?
Elige tu app arriba. La recordamos, así que la próxima vez el botón dirá “Instalar en …”.
Abre Claude Desktop → Settings → Developer → Edit Config y pega esto en claude_desktop_config.json
{
"mcpServers": {
"otc-pricing": {
"command": "uvx",
"args": [
"otc-pricing-mcp"
]
}
}
}Ejecuta esto en tu terminal
claude mcp add otc-pricing -- uvx otc-pricing-mcpPégalo en .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json
{
"mcpServers": {
"otc-pricing": {
"command": "uvx",
"args": [
"otc-pricing-mcp"
]
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Pégalo en .vscode/mcp.json de tu proyecto
{
"servers": {
"otc-pricing": {
"type": "stdio",
"command": "uvx",
"args": [
"otc-pricing-mcp"
]
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Este se ejecuta en tu computadora, y ChatGPT solo puede conectarse a servidores en internet. Elige otra app.
Tu elección se guarda en una cookie en este dispositivo; no necesitas cuenta.
Esta configuración se genera a partir de la ficha del creador en el registro. Si el README dice otra cosa, sigue el README.
Se ejecuta en tu computadora; la lista de herramientas aparece en tu app de IA después de instalarlo.
Revisamos información que cualquiera puede ver; no hemos leído el código. Las revisiones que no aplican no se cuentan. · Revisado el 8 nov 2026
El nombre en el registro se verificó con la cuenta de GitHub seaser0, dueña del repo
Todavía no hemos leído este repo en GitHub
Todavía no hemos leído este repo en GitHub
Este se ejecuta en tu computadora; no hay endpoint en internet
Se ejecuta en tu computadora y usa ajustes locales en su lugar
Se ejecuta en tu computadora; solo podemos leer listas de herramientas de endpoints en internet
Comparado con todos los servidores activos de esta categoría en el registro. Las estrellas solo cuentan cuando quien lo publica es dueño del repo.
Superó 1 de 1 revisiones básicas aplicables. No hemos leído el código. Antes de agregar una clave o un token, revisa qué acceso pide el servidor y usa una clave que tenga solo los permisos que necesitas.
El registro no indica ninguna clave obligatoria, aunque algunos servidores te piden iniciar sesión la primera vez que los usas.
Se ejecuta en tu computadora. Tu app de IA lo inicia cuando hace falta, y los datos no pasan por los servidores del creador (a menos que el propio servidor llame a un servicio en línea).
El repo de GitHub cambió por última vez –, y la última versión (0.1.1) llegó al registro hace 6 meses.
Las apps compatibles con MCP, como Claude Desktop, Claude Code, Cursor y VS Code. También necesitas Python (uv) en tu computadora.
En la misma categoría: Spec Driven Development, Remote Desktop Commander, Tool Guardian
Servidores de la misma categoría hechos por otros creadores, ordenados por estrellas.
Cómo leer una tarjeta:★ Estrellas de GitHubiTres pilares: reseñas · revisiones · usoiActualizado = fecha en que se publicó la última versión en el registroi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Too many MCP servers eating your context? A router that loads each tool's schema only when needed.
Copiado tal cual del repo del creador. PopNx MCP no lo ha revisado ni lo respalda. Se quitaron HTML, imágenes y scripts. Los enlaces llevan fuera de este sitio.
An open-source Model Context Protocol (MCP) server for the Open Telekom Cloud (OTC) Price Calculator API.
Expose OTC pricing data to Claude and other LLM clients with full observability (structured logging, Prometheus metrics, health checks).
Status: v0.1.3 — STDIO + SSE transports, Kubernetes deployment, full observability
Model Context Protocol is a standard that enables LLM applications (like Claude) to interact with external tools and data sources. This server supports two transports:
| Transport | How it works | Best for |
|---|---|---|
| STDIO | Claude launches the server as a subprocess; communication is over stdin/stdout | Local Claude Desktop, CLI tools |
| SSE | Server-Sent Events over HTTP — Claude connects to a URL | Remote/hosted deployments, web clients |
This server gives Claude access to OTC pricing data and the user-manual / API-reference documentation through 9 specialized tools, on whichever transport you prefer.
Example Use Cases:
find_compute_flavor tool → gets pricing data → answers youcompare_billing_models tool → does the analysis → shows savingsRequirements: Python 3.12+
# Clone the repository
git clone https://github.com/seaser0/otc-pricing-mcp.git cd otc-pricing-mcp
uv sync
python -m otc_pricing_mcp
What You'll See:
{"event": "mcp_server_starting", "transports": ["stdio", "sse"], "port": 8080, ...}
{"event": "mcp_server_ready", "status": "accepting_connections", ...}
The server now listens for MCP connections on both stdin/stdout and http://localhost:8080/sse.
Option A — STDIO (local, Claude Desktop)
{
"mcpServers": { "otc-pricing": { "command": "python", "args": ["-m", "otc_pricing_mcp"], "env": { "LOG_LEVEL": "INFO", "METRICS_PORT": "8080" } } } }
Option B — SSE (remote, Kubernetes)
Point any MCP client that supports SSE transport at the hosted endpoint:
{
"mcpServers": { "otc-pricing": { "url": "https://mcp-otc-pricing.example.com/sse" } } }
Or test locally while running the server:
# In a second terminal:
curl -N http://localhost:8080/sse
Once connected, Claude can call any of the 7 available tools. See the Tools Reference section below.
The server exposes 7 MCP tools for different pricing queries:
list_servicesPurpose: Get all available OTC services
Input: None
Output: List of service names and metadata
Example Claude usage:
"What OTC services are available for pricing?"
list_regionsPurpose: Get available OTC regions
Input: None
Output: List of region codes (eu-de, eu-nl, eu-ch2, etc.)
Example Claude usage:
"What regions does OTC support?"
get_service_schemaPurpose: Get filterable/returnable columns for a service
Input:
service (string): Service name (e.g., "ecs", "evs", "obs", "s3", "rds")Output: Schema with filterable and returnable column names
Example Claude usage:
"What columns can I filter on for ECS pricing?"
query_pricingPurpose: Query pricing data with flexible filtering
Input:
services (array): List of service names (e.g., ["ecs", "evs"])region (string, optional): Filter by region (e.g., "eu-de")max_results (integer, optional): Max results to return (default: 5000)Output: Pricing rows matching the filter
Example Claude usage:
"Show me ECS and EVS pricing in the eu-de region"
find_compute_flavorPurpose: Find compute (ECS) instances by vCPU/RAM/OS
Input:
v_cpu (integer): Number of virtual CPUsram_gb (number): RAM in GiBos (string, optional): Operating system (Linux, Windows, etc.)region (string, optional): Region (default: eu-de)Output: Matching ECS instance types with pricing
Example Claude usage:
"Find a Linux ECS instance with 4 CPUs and 16GB RAM in eu-nl"
estimate_monthly_costPurpose: Calculate monthly cost for multiple resources
Input:
items (array): Resources with:id (string): Product ID (e.g., "OTC_S3M1_LI")quantity (number, optional): How many units (default: 1)hours_per_month (number, optional): Usage hours (default: 730)Output: Itemized costs with monthly total
Example Claude usage:
"Calculate monthly cost for 100GB S3 storage and an ECS instance"
compare_billing_modelsPurpose: Compare PAYG vs Reserved Instance pricing
Input:
product_id (string): Product ID (e.g., "OTC_S3M1_LI")quantity (number, optional): Quantity (default: 1)hours_per_month (number, optional): Usage hours (default: 730)Output: Cost comparison for PAYG, 12mo, 24mo, 36mo reserved
Example Claude usage:
"Compare PAYG vs 12/24/36 month reserved pricing for ECS"
search_otc_docsPurpose: Full-text search across the indexed OTC user manual and API reference
Input:
query (string): Search terms (BM25-ranked, AND of tokens)scope (string, optional): public | swiss | both (default: both)service (string, optional): Restrict to one service repo (e.g. elastic-cloud-server)top_k (integer, optional): 1-50, default 5Output: Ranked list of {url, title, h2, h3, snippet, service, cloud, upstream_commit} hits. The index ships with the package and is rebuilt weekly from the upstream opentelekomcloud-docs/ Sphinx/RST repos (Apache-2.0); the runtime never touches the Anubis-gated docs.otc.t-systems.com HTML.
Example Claude usage:
"Find the OTC docs page that explains S3-flavor ECS specifications"
get_otc_doc_sectionPurpose: Fetch the body of one indexed documentation page (or one of its sections) as Markdown
Input:
url (string): Canonical URL as returned by search_otc_docs (with or without #anchor)section (string, optional): H2/H3 heading filter (case-insensitive substring)Output: {url, title, sections: [{h2, h3, anchor, body}, ...], matched, ...}
Example Claude usage:
"Show me the EVS Disk Types and Performance section"
Control the server behavior with environment variables:
| Variable | Default | Description |
|---|---|---|
LOG_LEVEL | INFO | Logging level: DEBUG, INFO, WARNING, ERROR |
METRICS_PORT | 8080 | Port for metrics/health endpoints |
METRICS_HOST | 0.0.0.0 | Bind address for the HTTP server (set to 127.0.0.1 for non-container runs) |
OTC_PRICING_API_BASE | https://calculator.otc-service.com/en/open-telekom-price-api/ | OTC API endpoint |
OTC_DOCS_DB | (auto) | Override path to the docs FTS5 index (default: bundled data/otc_docs.sqlite3) |
Example:
LOG_LEVEL=DEBUG METRICS_PORT=9090 python -m otc_pricing_mcp
This server is built with production-grade observability so you can debug issues and monitor performance.
Every action is logged as JSON, making logs machine-readable for aggregation and analysis.
Start the server with DEBUG logging:
LOG_LEVEL=DEBUG python -m otc_pricing_mcp 2>&1
You'll see JSON logs like:
{"timestamp": "2026-05-06T18:00:00.123456Z", "event": "tool_invocation_start", "tool": "query_pricing", "request_id": "550e8400-e29b-41d4-a716-446655440000", "arguments": {"services": ["ecs"]}}
{"timestamp": "2026-05-06T18:00:00.234567Z", "event": "upstream_request_start", "service": "ecs", "request_id": "550e8400-e29b-41d4-a716-446655440000"}
{"timestamp": "2026-05-06T18:00:00.345678Z", "event": "upstream_request_success", "service": "ecs", "request_id": "550e8400-e29b-41d4-a716-446655440000", "status_code": 200, "duration_seconds": 0.111, "attempt": 1, "items_returned": 42}
{"timestamp": "2026-05-06T18:00:00.456789Z", "event": "tool_invocation_success", "tool": "query_pricing", "request_id": "550e8400-e29b-41d4-a716-446655440000", "duration_seconds": 0.333}
Key fields in every log:
timestamp: When the event happened (ISO 8601)event: What happened (tool_invocation_start, upstream_request_success, etc.)request_id: Unique ID for this request (same across all related logs)Logs are printed to stderr, so redirect to a file or log aggregator:
python -m otc_pricing_mcp 2>/var/log/otc-pricing-mcp.log
Pipe to `jq` for pretty printing:
python -m otc_pricing_mcp 2>&1 | jq .
The uvicorn server exposes all endpoints on port 8080:
| Path | Method | Description |
|---|---|---|
/sse | GET | MCP SSE transport — connect your MCP client here |
/messages/ | POST | MCP SSE message handler (used internally by the client) |
/healthz | GET | Liveness probe — always 200 if the process is up |
/readyz | GET | Readiness probe — 200 when OTC API is reachable, 503 otherwise |
/metrics | GET | Prometheus metrics in text exposition format |
Health Checks:
# Liveness check (always 200 if process is up)
curl http://localhost:8080/healthz
curl http://localhost:8080/readyz
Prometheus Metrics:
curl http://localhost:8080/metrics
Returns Prometheus format metrics:
# HELP otc_pricing_mcp_requests_total Total MCP tool requests (success and failure)
otc_pricing_mcp_requests_total{status="success",tool="query_pricing"} 5.0 otc_pricing_mcp_requests_total{status="error",tool="query_pricing"} 1.0
otc_pricing_mcp_request_duration_seconds_bucket{le="0.005",tool="query_pricing"} 0.0 otc_pricing_mcp_request_duration_seconds_bucket{le="0.01",tool="query_pricing"} 1.0 ...
otc_pricing_mcp_upstream_requests_total{service="ecs",status="success"} 10.0 otc_pricing_mcp_upstream_requests_total{service="ecs",status="error"} 2.0 ...
Available Metrics:
otc_pricing_mcp_requests_total{tool, status}: Count of tool invocationsotc_pricing_mcp_request_duration_seconds{tool}: Tool execution timeotc_pricing_mcp_upstream_requests_total{service, status}: Count of API callsotc_pricing_mcp_upstream_duration_seconds{service}: API call latencyUsing Prometheus:
Add to your prometheus.yml:
scrape_configs:
Solo se muestra el principio; lee el resto en el repo