Pod

Yes, this is on purpose. Pod is built for agents, so the default page is plain HTML.
Human? View the normal website.
Agent? You probably prefer /mcp/otc-pricing-mcp/issues.md or /mcp/otc-pricing-mcp/issues.json, or Pod over MCP.

Reported issues for OTC Pricing MCP

Pod holds 16 of 36 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to OTC Pricing MCP.

Most discussed

eu-ch2 (Swiss OTC) coverage limitation: upstream Calculator API doesn't expose ECS/EVS/RDS/NAT/ELB/AOM — needs doc + optional patch hook

Summary

The MCP correctly proxies upstream data, but the t-systems Price Calculator API (https://calculator.otc-service.com/en/open-telekom-price-api/) exposes only a subset of services for eu-ch2 (Swiss Open Telekom Cloud). Several core IaaS services (ECS, EVS, RDS, NAT, ELB, AOM) return stats.count = 0 from the upstream for filterBy[region]=eu-ch2 — even though those services are sold in eu-ch2 according to the public T-Systems CH product pages and confirmed by users with i

Read the thread · 2026-05-11 · closed · 4 comments

swiss-otc / eu-ch2 catalog unreachable: productType hardcoded to OTC; no SOTC variant accepted by upstream

Bug: swiss-otc / eu-ch2 catalog unreachable via MCP (productType hardcoded to OTC)

Symptom

Queries against the MCP for region=eu-ch2 (Swiss OTC, CHF-priced subset) return empty results for most services. Example:

query_pricing(['evs'], region='eu-ch2')  # → 0 items
query_pricing(['ecs'], region='eu-ch2')  # → 0 items

Discovery.py:10-12 acknowledges the gap:

eu-ch2 (Swiss OTC, CHF) only carries a subset of services (obs, kms, lts, hss, ito, apig, etc.)

…but in pra

Read the thread · 2026-05-24 · closed · 1 comment

security.yml pip-audit blocks every version bump (--strict + editable local project)

Severity: MEDIUM — CI workflow blocker

Symptom

After bumping the project version (e.g. 0.1.8 → 0.1.9 in PR #46) the `Dependency Audit (pip-audit)` job in `security.yml` fails with:

``` ERROR:pip_audit._cli:otc-pricing-mcp: Dependency not found on PyPI and could not be audited: otc-pricing-mcp (0.1.9) ```

The same audit in `ci.yml`'s `Security - Dependency Audit (pip-audit)` job passes for the same commit. `security.yml`'s `Security Checks Summary` aggregates the fail

Read the thread · 2026-05-09 · closed · 1 comment

get_otc_doc_section: section="" silently treated as 'no filter'

Severity: LOW — falsy-empty anti-pattern

Reproduce

get_otc_doc_section(url=<valid_page>, section="")
→ all sections returned (same as section=None)

tools/docs.py:233: if section: is falsy on "", so an empty string is silently equivalent to omitting the parameter. A caller that builds the call dynamically and accidentally passes section="" won't see a "no match" — they'll get the entire page.

Expected

Either reject empty string (ValueError) or document the equival

Read the thread · 2026-05-09 · closed · 1 comment

get_otc_doc_section: 'page exists, section missing' is indistinguishable from 'page not found'

Severity: MEDIUM — UX/correctness

Reproduce

# Page does not exist
get_otc_doc_section(url="https://docs.otc.t-systems.com/nonexistent/page.html")
→ {matched: false, sections: [], title: "", service: "", ...}

# Page exists, section filter does not match
get_otc_doc_section(
    url="https://docs.otc.t-systems.com/elastic-cloud-server/umn/service_overview/permissions.html",
    section="this-section-does-not-exist"
)
→ {matched: false, sections: [], title: "", service: "", ...}

Read the thread · 2026-05-09 · closed · 1 comment

search_otc_docs: unknown 'service' filter silently returns []

Severity: MEDIUM — silent-empty anti-pattern (sister of #6, #35)

Reproduce

search_otc_docs(query="VPC", service="nonexistent-service-xyz")
→ {hits: [], total_hits: 0, isError: false}

A typo'd service name returns empty results indistinguishable from a service that exists but has no matches.

Expected

Validate service against the set of services actually indexed (already discoverable: SELECT DISTINCT service FROM docs). Unknown service → ValueError listing valid servic

Read the thread · 2026-05-09 · closed · 1 comment

search_otc_docs: top_k silently clamped (0/-5 → 1, 999 → 50, no warning)

Severity: MEDIUM — silent-clamp anti-pattern (sister of #33)

Reproduce

search_otc_docs(query="VPC", top_k=0)   → returns 1 hit, isError=false
search_otc_docs(query="VPC", top_k=-5)  → returns 1 hit, isError=false
search_otc_docs(query="VPC", top_k=999) → returns 50 hits, isError=false

Root cause

tools/docs.py:138: top_k = max(1, min(50, int(top_k))) clamps without surfacing the change. Caller has no signal that their requested cap was changed.

Expected

Read the thread · 2026-05-09 · closed · 1 comment

search_otc_docs: empty / whitespace-only query silently returns 0 hits

Severity: HIGH — silent-zero anti-pattern (same family as #4, #6, #31, #33)

Reproduce

search_otc_docs(query="")    → {hits: [], total_hits: 0, isError: false}
search_otc_docs(query="   ") → {hits: [], total_hits: 0, isError: false}

A caller (LLM or human) typoing into an empty string gets no signal that the query was rejected.

Root cause

tools/docs.py:_escape_match returns the empty FTS5 phrase '""' for empty input; the FTS5 syntax-error path then collapses to `rows =

Read the thread · 2026-05-09 · closed · 1 comment

Most recent

[Security Alert] Vulnerabilities detected in nightly scan

⚠️ Security vulnerabilities detected in the nightly security scan

Details

Failed Checks

Please review the workflow results for detailed vulnerability information.


*This issue was auto

Read the thread · 2026-08-17 · open · external user · 0 comments

query_pricing misses memory-optimized ECS (m4/m7n/m9) — v2 API / serviceName=memo not supported

Summary

query_pricing(services=['ecs'], region='eu-de') returns only general-purpose flavors (s2/s3/s7n/s9, RAM ratios .1/.2/.4). Memory-optimized ECS (m4/m7n/m9, ratio .8) is missing — it lives in a separate API endpoint that the MCP does not query.

Root cause

The MCP queries the v1 API (/en/open-telekom-price-api/) with serviceName=ecs. Memory-optimized flavors are only exposed via the v2 API (/en/open-telekom-price-api/v2/) with serviceName=memo.

Direct e

Read the thread · 2026-07-14 · closed · 0 comments

[Security Alert] Vulnerabilities detected in nightly scan

⚠️ Security vulnerabilities detected in the nightly security scan

Details

Failed Checks

Please review the workflow results for detailed vulnerability infor

Read the thread · 2026-05-17 · closed · external user · 0 comments

Ghost eu-ch2 rows in default catalog: misreport CHF prices as EUR

Problem

The default OTC price-calculator catalog (client=1, public T-Cloud) contains 75 entries whose region == "eu-ch2" but currency == "EUR" — these are NOT real Swiss prices. The actual Swiss CHF prices live in client=2 (resolved correctly by #50 / #51 when the caller supplies region="eu-ch2").

Consequence: a caller that queries a service without a region filter today gets a silently misleading mix:

# After PR #51, this works correctly (uses client=2):
query_pricing(

[Read the thread](https://github.com/seaser0/otc-pricing-mcp/issues/52) · 2026-05-12 · closed · 0 comments

### find_compute_flavor: response truncation when broad filters return many flavors + tighten tool description

## Summary
Broad `find_compute_flavor` queries (e.g. "GPU=true, region=eu-de") return so many full-detail flavor entries that the response exceeds the MCP tool-output limit on the consumer side. The result has to be greppe'd from the raw payload instead of read directly.

## Reproduction
Asking Claude to "find OTC ECS flavors with a single A100 GPU" caused `find_compute_flavor` to return enough flavors that the assistant logged:

> OTC-Antwort war zu groß — gegrept aus der Datei.

This happened 

[Read the thread](https://github.com/seaser0/otc-pricing-mcp/issues/49) · 2026-05-10 · closed · 0 comments

### get_otc_doc_section: URL LIKE-prefix matches ALL sections on empty/wildcard input, returns 3.5MB Frankenstein response

**Severity: HIGH** — correctness + token-DoS + LIKE-wildcard injection

## Reproduce (live MCP, 2026-05-09)

get_otc_doc_section(url="") → sections=4714, 3.5MB, isError=false get_otc_doc_section(url="%") → sections=4714, 3.5MB get_otc_doc_section(url="https://") → sections=4714, 3.5MB get_otc_doc_section(url="https://docs.otc.t-systems.com/_______________") → sections=4714, 3.5MB


## Root cause

`src/otc_pricing_mcp/tools/docs.py:231-232`:

```python
sql_parts = ["ur

[Read the thread](https://github.com/seaser0/otc-pricing-mcp/issues/40) · 2026-05-09 · closed · 0 comments

### get_service_schema returns the same generic catalog schema for every service

## Observation

Calling `get_service_schema` for `ecs`, `evs`, `obs` (and presumably others) returns **identical** column metadata — the upstream OTC API serves the union of all possible columns, not a per-service projection.

get_service_schema(ecs).columns == get_service_schema(evs).columns == get_service_schema(obs).columns == {"id": "ID", "productId": "Service ID", ..., "vCpu": "vCpu", "ram": "RAM", "storageType": "Storage type", "storageVolume": "Storage volume", "R12": "Reserve

Read the thread · 2026-05-08 · closed · 1 comment

estimate_monthly_cost accepts negative quantity, returns negative totals

Symptom

tools/call estimate_monthly_cost {"items":[{"id":"OTC_S3M1_LI","quantity":-1}]}

→ total_payg: -37.35775
  items[0].quantity: -1.0
  items[0].payg: -37.35775
isError: false

Negative quantity is accepted and produces a negative-cost "estimate". Same shape with very large quantities (999999~37 M EUR, no upper sanity bound).

Why it matters

LLMs assemble these calls from natural language and sometimes mis-extract a number. Reporting "-€37" for a workload makes a budg

Read the thread · 2026-05-08 · closed · 1 comment

The remaining reports are on the project's issue tracker.