{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T16:36:53.314Z","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates","markdownUrl":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates.md","server":{"slug":"cyanheads-exchange-rates-mcp-server","name":"io.github.cyanheads/exchange-rates-mcp-server","registryName":"io.github.cyanheads/exchange-rates-mcp-server","description":"Convert currencies, get FX rates, and query historical Frankfurter v1 exchange rate data.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"exchange-rates","type":"remote","identifier":"https://exchange-rates.caseyjhand.com/mcp","withdrawn":false,"url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates","version":"0.6.0","transport":null,"scoredAt":"2026-11-05T06:26:25.236Z"},"score":{"total":90,"tier":"high trust","status":"scored","weekDelta":0,"history":[{"date":"2026-11-05","total":90},{"date":"2026-11-04","total":90},{"date":"2026-11-03","total":90},{"date":"2026-11-02","total":90},{"date":"2026-11-01","total":90},{"date":"2026-10-31","total":90},{"date":"2026-10-30","total":90},{"date":"2026-10-29","total":90},{"date":"2026-10-28","total":90},{"date":"2026-10-27","total":90},{"date":"2026-10-26","total":90},{"date":"2026-10-25","total":90},{"date":"2026-10-24","total":90},{"date":"2026-10-23","total":90},{"date":"2026-10-22","total":90},{"date":"2026-10-21","total":90},{"date":"2026-10-20","total":90},{"date":"2026-10-19","total":90},{"date":"2026-10-18","total":90},{"date":"2026-10-17","total":90},{"date":"2026-10-16","total":90},{"date":"2026-10-15","total":90},{"date":"2026-10-14","total":90},{"date":"2026-10-13","total":90},{"date":"2026-10-12","total":90},{"date":"2026-10-10","total":90},{"date":"2026-10-07","total":90},{"date":"2026-10-04","total":90},{"date":"2026-10-03","total":90},{"date":"2026-10-02","total":90}]},"categories":[{"name":"Endpoint Security","score":83,"verdict":"partial","reasons":["The endpoint's TLS certificate is valid, in date, and uses a strong key.","No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation.","HTTPS is enforced; there's no plaintext access path.","The HSTS (Strict-Transport-Security) header is present.","DNSSEC is configured correctly; the domain's records validate against the full chain to the root."],"codes":[{"code":"tls.valid","args":{}},{"code":"auth.none_no_destructive","args":{}},{"code":"https.enforced","args":{}},{"code":"headers.hsts_present","args":{}},{"code":"dnssec.validated","args":{}}]},{"name":"Transport & Reachability","score":100,"verdict":"pass","reasons":["Verified streamable-http transport via a live MCP handshake."],"codes":[{"code":"transport.verified","args":{"transport":"streamable-http"}}]},{"name":"Schema Quality & AI Usability","score":81,"verdict":"fail","reasons":["100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).","AI-judged instruction clarity (excellent).","Context-footprint check failed: tool/resource definitions use about 2132 tokens (~164/item across 13 items; 7 tools + 6 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.descriptions","args":{"pct":"100"}},{"code":"schema.ai_quality","args":{"band":"excellent"}},{"code":"schema.footprint_heavy","args":{"avg":"164","items":"13","tools":"7","tokens":"2132","resources":"6"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":100,"verdict":"pass","reasons":["No destabilizing schema changes in the last 30 days."],"codes":[{"code":"stability.stable","args":{}}]},{"name":"Tool Coverage","score":100,"verdict":"pass","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","100% of tool parameters carry a description.","Structured output schemas are declared (100% of tools); any adoption earns full credit."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"100"}},{"code":"toolquality.output_present","args":{"pct":"100"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","We read all 7 captured tool definition(s), and no name or description among them implies an irreversible operation.","An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_none","args":{"tools":"7"}},{"code":"toolsafety.manipulation_clean","args":{"units":"9","judged":"9"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a current MCP spec version (2026-07-28)."],"codes":[{"code":"protocol.current","args":{"version":"2026-07-28"}}]}],"inconclusive":[],"malware":[],"components":[{"slug":"exchange-rates","type":"remote","identifier":"https://exchange-rates.caseyjhand.com/mcp","withdrawn":false,"score":90,"current":true,"url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates","markdownUrl":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates.md"},{"slug":"cyanheads-exchange-rates-mcp-server","type":"npm","identifier":"@cyanheads/exchange-rates-mcp-server","withdrawn":false,"score":39,"current":false,"url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/cyanheads-exchange-rates-mcp-server","markdownUrl":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/cyanheads-exchange-rates-mcp-server.md"}],"facts":[{"label":"Endpoint","value":"https://exchange-rates.caseyjhand.com/mcp"},{"label":"Transports","value":"streamable-http"},{"label":"Auth","value":"none"},{"label":"Version","value":"0.6.0"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"fx_list_currencies","title":"Fx List Currencies","description":"List current Frankfurter v1 currency codes and names with as_of, the latest served rate date. include_retired=true adds historical codes absent from the current set. Optional official ECB start_date/end_date are outer coverage bounds, not uninterrupted availability; a dated end_date does not imply retirement. Metadata outages are disclosed without failing current discovery. Historical availability remains validated from requested v1 data. Use this to disambiguate dollars (USD vs AUD vs CAD).","inputs":[{"name":"include_retired","type":"boolean","required":false,"description":"Include historical codes absent from current v1 discovery, default false. Optional official ECB coverage dates are outer bounds and may contain gaps."}],"outputs":[{"name":"as_of","type":"string","required":false,"description":"Latest served daily rate date for this current-discovery list; historical availability is checked against historical data."},{"name":"count","type":"number","required":false,"description":"Total number of supported currencies."},{"name":"currencies","type":"array","required":false,"description":"All supported currencies, sorted alphabetically by code."},{"name":"error","type":"object","required":false,"description":"Present when the call failed. Absent on success."},{"name":"notice","type":"string","required":false,"description":"Discloses unavailable optional coverage metadata or incomplete coverage dates."},{"name":"source","type":"string","required":false,"description":"Always \"Frankfurter v1\" — the upstream data provider."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":135},{"name":"fx_get_rates","title":"Fx Get Rates","description":"Get all available exchange rates for one base currency in a single snapshot. Useful for bulk comparison and seeding downstream tools. Returns a map of quote currency → rate, the actual snapshot date, and whether a historical date was snapped from a weekend/holiday to the prior business day. Optionally filter to a subset of quote currencies via symbols. Listing the base currency itself in symbols is accepted and returns a rate of 1 for it.","inputs":[{"name":"base_currency","type":"string","required":true,"description":"ISO 4217 base currency code (e.g. USD). Call fx_list_currencies to get valid codes."},{"name":"date","type":"string","required":false,"description":"ISO 8601 date (YYYY-MM-DD). Omit for the latest available rate. Frankfurter v1 data starts 1999-01-04. Future dates are not supported."},{"name":"symbols","type":"array","required":false,"description":"Optional list of quote currency codes to filter the response. When provided, must contain at least one currency code — omit the field entirely, not an empty array, to return all ~30 supported currenc…"}],"outputs":[{"name":"base_currency","type":"string","required":false,"description":"The base currency code."},{"name":"date_snapped","type":"boolean","required":false,"description":"True when the API returned a different date than requested — Frankfurter v1 snaps weekend/holiday requests to the prior business day. Always false when date is omitted."},{"name":"error","type":"object","required":false,"description":"Present when the call failed. Absent on success."},{"name":"rate_date","type":"string","required":false,"description":"Actual date of the rates. May differ from requested date on weekends/holidays — daily observations may skip non-publication days; the API silently snaps to the prior business day."},{"name":"rate_type","type":"string","required":false,"description":"Always \"Daily rate (Frankfurter v1)\" — these are reference rates, not tradeable bid/ask."},{"name":"rates","type":"object","required":false,"description":"Map of quote currency code → exchange rate (units of quote per 1 base)."},{"name":"source","type":"string","required":false,"description":"Always \"Frankfurter v1\" — the upstream data provider."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":240},{"name":"fx_get_rate","title":"Fx Get Rate","description":"Get the exchange rate for a currency pair on a given date (default: latest). Returns the rate, the actual rate date (which may differ from the requested date on weekends/holidays — daily observations may skip non-publication days), and source provenance. Cross-rates are triangulated through EUR automatically. A same-currency pair returns a rate of 1, dated to the same publication day any other pair would report for that date. Use fx_convert_currency when you want the converted amount; use this tool when you only need the rate number.","inputs":[{"name":"base_currency","type":"string","required":true,"description":"ISO 4217 base currency code (e.g. USD). Call fx_list_currencies to get valid codes."},{"name":"date","type":"string","required":false,"description":"ISO 8601 date (YYYY-MM-DD). Omit for the latest available rate. Frankfurter v1 data starts 1999-01-04. Future dates are not supported."},{"name":"quote_currency","type":"string","required":true,"description":"ISO 4217 quote currency code (e.g. EUR). The rate is expressed as \"how many quote units per 1 base unit\". Call fx_list_currencies to get valid codes."}],"outputs":[{"name":"base_currency","type":"string","required":false,"description":"The base currency code."},{"name":"date_snapped","type":"boolean","required":false,"description":"True when the API returned a different date than requested — Frankfurter v1 snaps weekend/holiday requests to the prior business day."},{"name":"error","type":"object","required":false,"description":"Present when the call failed. Absent on success."},{"name":"quote_currency","type":"string","required":false,"description":"The quote currency code."},{"name":"rate","type":"number","required":false,"description":"Exchange rate: units of quote currency per 1 unit of base currency."},{"name":"rate_date","type":"string","required":false,"description":"Actual date of the rate returned."},{"name":"rate_type","type":"string","required":false,"description":"Always \"Daily rate (Frankfurter v1)\" — these are reference rates, not tradeable bid/ask."},{"name":"source","type":"string","required":false,"description":"Always \"Frankfurter v1\" — the upstream data provider."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":240},{"name":"fx_convert_currency","title":"Fx Convert Currency","description":"Convert an amount between any two currencies at the latest or a historical rate. Returns the converted amount, the rate used, the actual rate date, and whether the date was snapped from a weekend/holiday to the prior business day. Cross-rates are triangulated through EUR automatically.","inputs":[{"name":"amount","type":"number","required":true,"description":"Amount in the base currency to convert. Must be greater than zero."},{"name":"base_currency","type":"string","required":true,"description":"ISO 4217 source currency code (e.g. USD). Call fx_list_currencies to get valid codes."},{"name":"date","type":"string","required":false,"description":"ISO 8601 date (YYYY-MM-DD) for a historical rate. Omit for the latest available rate. Frankfurter v1 data starts 1999-01-04. Future dates are not supported."},{"name":"quote_currency","type":"string","required":true,"description":"ISO 4217 target currency code (e.g. EUR). The amount will be expressed in this currency. Call fx_list_currencies to get valid codes."}],"outputs":[{"name":"base_amount","type":"number","required":false,"description":"The input amount in the base currency."},{"name":"base_currency","type":"string","required":false,"description":"Source currency code."},{"name":"date_snapped","type":"boolean","required":false,"description":"True when the API returned a different date than requested — Frankfurter v1 snaps weekend/holiday requests to the prior business day."},{"name":"error","type":"object","required":false,"description":"Present when the call failed. Absent on success."},{"name":"quote_amount","type":"number","required":false,"description":"The unrounded amount × rate product in the quote currency, using JavaScript floating-point precision; no currency minor-unit rounding policy is applied."},{"name":"quote_currency","type":"string","required":false,"description":"Target currency code."},{"name":"rate","type":"number","required":false,"description":"Exchange rate used: units of quote currency per 1 unit of base currency."},{"name":"rate_date","type":"string","required":false,"description":"Actual date of the rate used for conversion."},{"name":"rate_type","type":"string","required":false,"description":"Always \"Daily rate (Frankfurter v1)\" — these are reference rates, not tradeable bid/ask."},{"name":"source","type":"string","required":false,"description":"Always \"Frankfurter v1\" — the upstream data provider."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":203},{"name":"fx_get_timeseries","title":"Fx Get Timeseries","description":"Get historical daily Frankfurter v1 rates over an inclusive date range. Same-date EUR legs are divided without intermediate rounding; only days with both currencies appear, including observed self-pairs at 1 and historical retired currencies. Missing-leg served days produce coverage notices; weekends and holidays are not counted as missing. summary covers all observed days before delivery: arithmetic mean, earliest tied extrema, endpoints and percentage change, without accounting policy. limit bounds returned rows (default/max 500); 0 returns summary only. Continue inline with next_start_date, the same end_date and a positive limit. Long ranges (>90 days by default) stage beyond the 40,000-character preview budget, independently of limit. Explicit canvas_id always stages the complete series, including short/empty results, and fails if unavailable or unknown. Each registration preserves earlier tables with a unique table_name. spilled=true returns canvas_id and table_name; use fx_dataframe_describe then fx_dataframe_query for SQL. Without DataCanvas, omit canvas_id to page inline.","inputs":[{"name":"base_currency","type":"string","required":true,"description":"ISO 4217 base currency code (e.g. USD). Call fx_list_currencies to get valid codes."},{"name":"canvas_id","type":"string","required":false,"description":"Existing canvas ID from a prior call explicitly requesting staging even for short or empty results. Every call creates a uniquely named table. Omit for automatic staging or inline paging."},{"name":"end_date","type":"string","required":true,"description":"ISO 8601 end date (YYYY-MM-DD). Must be >= start_date. Future dates are not supported."},{"name":"limit","type":"integer","required":false,"description":"Maximum observations returned in rates, default 500, clamped to 500. Use 0 for summary only; continue inline with a positive limit. Does not affect summary, counts, bounds, staging eligibility or the…"},{"name":"quote_currency","type":"string","required":true,"description":"ISO 4217 quote currency code (e.g. EUR). Call fx_list_currencies to get valid codes."},{"name":"start_date","type":"string","required":true,"description":"ISO 8601 start date (YYYY-MM-DD). Frankfurter v1 data starts 1999-01-04. The actual first data point may be later if start_date falls on a weekend/holiday."}],"outputs":[{"name":"base_currency","type":"string","required":false,"description":"Base currency code."},{"name":"canvas_id","type":"string","required":false,"description":"Canvas ID — present when spilled is true. Pass to fx_dataframe_describe to inspect the staged table, then to fx_dataframe_query to run SQL."},{"name":"end_date","type":"string","required":false,"description":"Last publication date in the requested range. Always inside the requested range — earlier than the requested end when that day had no Frankfurter v1 fix, and equal to it when the series is empty. Lat…"},{"name":"error","type":"object","required":false,"description":"Present when the call failed. Absent on success."},{"name":"next_start_date","type":"string","required":false,"description":"Present only when an inline page was cut short: the first publication date not in rates. Pass it as start_date with the same end_date and a positive limit to get the next page. For limit 0 it is the…"},{"name":"notice","type":"string","required":false,"description":"Explains a result that would otherwise look broken or incomplete: an empty series (no publication day in the range); an inline page cut short (the start_date to continue from, plus why a long range w…"},{"name":"quote_currency","type":"string","required":false,"description":"Quote currency code."},{"name":"rate_count","type":"number","required":false,"description":"Total observed publication days in the requested range (the start_date through end_date passed on this call) — not the number of entries in rates, which is smaller when truncated is true. On a contin…"},{"name":"rate_type","type":"string","required":false,"description":"Always \"Daily rate (Frankfurter v1)\" — these are reference rates, not tradeable bid/ask."},{"name":"rates","type":"object","required":false,"description":"Date → rate map in date order, observed days inside the requested range only. Bounded by limit (default/max 500), and by the character budget for automatically staged previews. Empty for limit 0 or n…"},{"name":"source","type":"string","required":false,"description":"Always \"Frankfurter v1\" — the upstream data provider."},{"name":"spilled","type":"boolean","required":false,"description":"True when the complete result was staged on DataCanvas, either explicitly through canvas_id or automatically after exceeding the threshold and preview budget."},{"name":"start_date","type":"string","required":false,"description":"First observed publication date in the requested range, including when limit is 0. Always inside the requested range — later than the requested start when that day had no Frankfurter v1 fix, and equa…"},{"name":"summary","type":"object","required":false,"description":"Statistics over all observed days in the full clipped requested range before limit, paging or staging; omitted for empty ranges. Missing-leg coverage notices describe excluded served days. Continuati…"},{"name":"table_name","type":"string","required":false,"description":"Canvas table name — present when spilled is true. Use it as the FROM target in fx_dataframe_query SQL; fx_dataframe_describe lists its columns."},{"name":"truncated","type":"boolean","required":false,"description":"True when rates holds only part of the series: an inline page (next_start_date continues it) or a spilled preview (spilled is true). False when rates holds every publication day in the requested rang…"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":449},{"name":"fx_dataframe_describe","title":"Fx Dataframe Describe","description":"List tables and columns staged on a DataCanvas from a prior fx_get_timeseries call. Required first step before fx_dataframe_query — use it to discover table names and column schemas. Requires DataCanvas, which is on by default — a deployment that turns it off does not list this tool at all, and fx_get_timeseries returns every range inline there.","inputs":[{"name":"canvas_id","type":"string","required":true,"description":"Canvas ID returned by fx_get_timeseries. Re-run fx_get_timeseries to obtain a fresh canvas_id if this one has expired."}],"outputs":[{"name":"canvas_id","type":"string","required":false,"description":"The canvas ID echoed back — use this in fx_dataframe_query."},{"name":"error","type":"object","required":false,"description":"Present when the call failed. Absent on success."},{"name":"expires_at","type":"string","required":false,"description":"ISO 8601 timestamp when this canvas will be evicted."},{"name":"tables","type":"array","required":false,"description":"All tables and views currently staged on this canvas."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":115},{"name":"fx_dataframe_query","title":"Fx Dataframe Query","description":"Run a read-only SQL SELECT against DataCanvas tables staged by fx_get_timeseries. Supports aggregations, GROUP BY, window functions, and JOINs across multiple registered tables. Run fx_dataframe_describe first to discover table names and column schemas. Requires DataCanvas, which is on by default — a deployment that turns it off does not list this tool at all, and fx_get_timeseries returns every range inline there.","inputs":[{"name":"canvas_id","type":"string","required":true,"description":"Canvas ID returned by fx_get_timeseries. Re-run fx_get_timeseries to obtain a fresh canvas_id if this one has expired."},{"name":"query","type":"string","required":true,"description":"Read-only SQL SELECT statement. Reference tables by the names returned by fx_dataframe_describe or the table_name field from fx_get_timeseries. Example: SELECT date, rate FROM <table_name> WHERE date…"},{"name":"row_limit","type":"integer","required":false,"description":"Most rows to return (positive integer, default 150; values above 10000 clamp to 10000 with a notice). When the query produces more, truncated is true — page with ORDER BY <column> LIMIT <n> OFFSET <m…"}],"outputs":[{"name":"canvas_id","type":"string","required":false,"description":"The canvas ID used — pass to a subsequent fx_dataframe_query or fx_dataframe_describe call."},{"name":"error","type":"object","required":false,"description":"Present when the call failed. Absent on success."},{"name":"notice","type":"string","required":false,"description":"Reports requested and effective row limits when clamped, and the ORDER BY … LIMIT … OFFSET query shape when the result is truncated."},{"name":"row_count","type":"number","required":false,"description":"Rows returned — always the length of rows. When truncated is true this equals row_limit, not the full result size."},{"name":"rows","type":"array","required":false,"description":"Result rows, at most row_limit (default 150). Each key is a column name from the query."},{"name":"truncated","type":"boolean","required":false,"description":"True when the query produced more rows than row_limit and rows holds only the first row_limit of them. Fetch the rest with ORDER BY <column> LIMIT <n> OFFSET <m> — ORDER BY is required for determinis…"}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":275}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T06:26:25.000Z","track":"remote","endpoint":"https://exchange-rates.caseyjhand.com/mcp","declaredUrl":null,"truncated":false,"tls":{"outcome":"valid","label":"Valid","version":"TLS 1.3","cipherSuite":"TLS_AES_128_GCM_SHA256","chainError":null,"certificates":[{"subject":"CN=caseyjhand.com","issuer":"CN=WE1,O=Google Trust Services,C=US","notBefore":"2026-11-02T21:39:32Z","notAfter":"2027-01-31T22:39:21Z","keyType":"ECDSA","keyBits":256,"isCa":false},{"subject":"CN=WE1,O=Google Trust Services,C=US","issuer":"CN=GTS Root R4,O=Google Trust Services LLC,C=US","notBefore":"2023-12-13T09:00:00Z","notAfter":"2029-02-20T14:00:00Z","keyType":"ECDSA","keyBits":256,"isCa":true},{"subject":"CN=GTS Root R4,O=Google Trust Services LLC,C=US","issuer":"CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE","notBefore":"2023-11-15T03:43:21Z","notAfter":"2028-01-28T00:00:42Z","keyType":"ECDSA","keyBits":384,"isCa":true}]},"dnssec":{"result":"secure","label":"Secure","name":"exchange-rates.caseyjhand.com.","steps":[{"zone":".","outcome":"verified","label":"Verified"},{"zone":"com.","outcome":"verified","label":"Verified"},{"zone":"caseyjhand.com.","outcome":"verified","label":"Verified"},{"zone":"exchange-rates.caseyjhand.com.","outcome":"verified","label":"Verified"}]},"auth":{"outcome":"none","label":"No authorisation required","gate":null,"gateLabel":null,"status":200,"authorizationServers":[]},"httpsRedirect":{"outcome":"https_enforced","label":"HTTPS enforced","status":301},"transports":[{"transport":"streamable-http","outcome":"verified","label":"Verified","status":200,"followed":false}],"provenance":null,"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-07-26","recent":[{"id":"chg_01a1a0b8-f7bb-733d-bb38-4b686f41dff1","kind":"server.version_changed","summary":"Server version (0.5.1 → 0.6.0)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a1a0b8-f7bb-733d-bb38-4b686f41dff1"},{"id":"chg_01a1a0b8-f7ba-7a7b-ac33-6406424014b6","kind":"resource.added","summary":"New resource “exchange-rates-guide”","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a1a0b8-f7ba-7a7b-ac33-6406424014b6"},{"id":"chg_01a1a0b8-f7ba-7412-a207-81779ab3012a","kind":"param.added_optional","summary":"“fx_list_currencies” added an optional parameter “include_retired”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a1a0b8-f7ba-7412-a207-81779ab3012a"},{"id":"chg_01a1a0b8-f7b9-7d5c-b2f3-4f7e28667c9d","kind":"tool.description_changed","summary":"Tool “fx_list_currencies” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a1a0b8-f7b9-7d5c-b2f3-4f7e28667c9d"},{"id":"chg_01a1a0b8-f7b9-745b-84ac-b9b707f9cf5c","kind":"param.added_optional","summary":"“fx_get_timeseries” added an optional parameter “limit”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a1a0b8-f7b9-745b-84ac-b9b707f9cf5c"},{"id":"chg_01a1a0b8-f7b8-7334-aaa0-219ae5fb2ea6","kind":"tool.description_changed","summary":"Tool “fx_get_timeseries” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a1a0b8-f7b8-7334-aaa0-219ae5fb2ea6"},{"id":"chg_01a1a0b8-f7bb-7aca-b1b9-7ba95e3e17fb","kind":"server.instructions_changed","summary":"The server rewrote its instructions, which are the text every model session reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a1a0b8-f7bb-7aca-b1b9-7ba95e3e17fb"},{"id":"chg_01a1a0b8-f7b7-75aa-93d4-36de2826b8cc","kind":"check.measure","summary":"Schema quality (1896 → 2132)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a1a0b8-f7b7-75aa-93d4-36de2826b8cc"},{"id":"chg_01a16d37-742f-7682-bb4a-35277118cf25","kind":"param.description_changed","summary":"“fx_get_timeseries” reworded the description of “start_date”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742f-7682-bb4a-35277118cf25"},{"id":"chg_01a16d37-742e-75ac-a743-64d1533ef225","kind":"param.description_changed","summary":"“fx_get_rates” reworded the description of “date”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742e-75ac-a743-64d1533ef225"},{"id":"chg_01a16d37-742d-7edc-924d-5243c2c24550","kind":"param.description_changed","summary":"“fx_get_rate” reworded the description of “date”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742d-7edc-924d-5243c2c24550"},{"id":"chg_01a16d37-742c-7e87-8b7a-d58d66aebcad","kind":"tool.description_changed","summary":"Tool “fx_get_rate” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742c-7e87-8b7a-d58d66aebcad"},{"id":"chg_01a16d37-742c-782b-a833-b169b32c3a1c","kind":"param.description_changed","summary":"“fx_dataframe_query” reworded the description of “row_limit”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742c-782b-a833-b169b32c3a1c"},{"id":"chg_01a16d37-742b-7a71-8a8a-f6c1a9885c81","kind":"param.description_changed","summary":"“fx_dataframe_query” reworded the description of “query”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742b-7a71-8a8a-f6c1a9885c81"},{"id":"chg_01a16d37-742a-7893-a337-4077bbf57e60","kind":"param.description_changed","summary":"“fx_convert_currency” reworded the description of “date”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742a-7893-a337-4077bbf57e60"},{"id":"chg_01a16d37-742e-7b9d-bac5-6d8afc7bd119","kind":"tool.description_changed","summary":"Tool “fx_get_timeseries” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742e-7b9d-bac5-6d8afc7bd119"},{"id":"chg_01a16d37-742f-7151-a045-8e3195719d55","kind":"param.description_changed","summary":"“fx_get_timeseries” reworded the description of “canvas_id”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742f-7151-a045-8e3195719d55"},{"id":"chg_01a16d37-742f-7c9f-b8b5-bf7e5983be27","kind":"tool.description_changed","summary":"Tool “fx_list_currencies” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-742f-7c9f-b8b5-bf7e5983be27"},{"id":"chg_01a16d37-7430-7383-857c-cfbf62692cd2","kind":"server.version_changed","summary":"Server version (0.5.0 → 0.5.1)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-7430-7383-857c-cfbf62692cd2"},{"id":"chg_01a16d37-7430-7989-b15f-7faf86e20ff2","kind":"server.instructions_changed","summary":"The server rewrote its instructions, which are the text every model session reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates#chg-chg_01a16d37-7430-7989-b15f-7faf86e20ff2"}],"truncated":true,"feedUrl":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates/changelog.json"},"links":{"html":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates","markdown":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates.md","changelogJson":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates/changelog.json","changelogRss":"https://verifymcp.io/servers/cyanheads-exchange-rates-mcp-server/exchange-rates.xml","external":[{"label":"Remote endpoint","href":"https://exchange-rates.caseyjhand.com/mcp"},{"label":"Repository","href":"https://github.com/cyanheads/exchange-rates-mcp-server"}]}}