cityparity
Cost-of-living and quality-of-life comparison across ~165 cities: take-home pay, the equivalent salary you'd need, and the safety-net deltas (childcare, healthcare, vacation, parental leave).
Allow With Approval
trustsnap_9e83613047a3591b.- Utility Coverage
- Step Up Auth
- Resource Contract
- Align MCP-Protocol-Version, MCP-Session-Id, DELETE teardown, and expired-session handling with the transport spec.
- Serve /.well-known/oauth-protected-resource and point it at your authorization server metadata.
- Publish /.well-known/oauth-authorization-server from your issuer and include registration endpoint when supported.
- Machine trust evaluator activity
- ledger / trust summary inspection
Dispute this assessment
If any published claim about this server -- its score, a risk flag, a capability classification, or its taxonomy -- is factually wrong, tell us what evidence shows and we will review it. This does not require claiming or verifying ownership of the server first.
Verify responds to disputes within 5 business days and resolves them within 15.
Dispute history
No disputes filed for this server.
Risks
Security posture
Tool capability & risk inventory
| Tool | Capabilities | Risk | Findings | Notes | Evidence |
|---|---|---|---|---|---|
compare_cities |
read | Low | none | Safeguards hinted in metadata. |
Schema & evidence{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"capabilities": [
"read"
],
"input_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"advanced": {
"additionalProperties": false,
"description": "Optional fine-tuning: retirement contribution, age bracket, trips home, transit mode, and inbound tax regime. Omit to use defaults.",
"properties": {
"age_bracket": {
"description": "Affects US healthcare premium multipliers. Default 25-34.",
"enum": [
"18-24",
"25-34",
"35-44",
"45-54",
"55-64"
],
"type": "string"
},
"apply_inbound_regime": {
"description": "Apply the destination country's special inbound-worker tax regime if available (Italy impatriati, Portugal IFICI, Belgium expat, Poland B2B rycza\u0142t, Greece inbound). Default false. Applies only on the target side.",
"type": "boolean"
},
"retirement_contrib_pct": {
"description": "Percentage of gross diverted to retirement (pre-tax for US 401k). Default 6.",
"maximum": 50,
"minimum": 0,
"type": "number"
},
"source_transit_choice": {
"description": "Default depends on city; e.g. Seattle defaults to 'car', Oslo defaults to 'transit'.",
"enum": [
"car",
"transit"
],
"type": "string"
},
"target_transit_choice": {
"description": "Same as above for the target city.",
"enum": [
"car",
"transit"
],
"type": "string"
},
"trips_home_per_year": {
"description": "Round trips back to source country per year (target-only cost). Default 1.",
"maximum": 12,
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"gross_salary": {
"description": "User's annual gross salary in the SOURCE city's local currency (e.g. USD for Seattle, NOK for Oslo).",
"exclusiveMinimum": 0,
"maximum": 50000000,
"type": "number"
},
"household": {
"additionalProperties": false,
"description": "Family structure: working-age partner and dependent children. Omit for a single person with no kids.",
"properties": {
"has_partner": {
"description": "Whether the user has a working-age partner. Defaults to false.",
"type": "boolean"
},
"kids_ages": {
"description": "Ages of dependent children, e.g. [3, 7]. Empty array or omitted if no kids.",
"items": {
"maximum": 25,
"minimum": 0,
"type": "integer"
},
"maxItems": 10,
"type": "array"
},
"partner_gross_salary": {
"description": "Partner's annual gross salary in the SOURCE city's currency. REQUIRED when has_partner=true.",
"maximum": 50000000,
"minimum": 0,
"type": "number"
},
"partner_works_in_source": {
"description": "Whether the partner currently earns in the source city. REQUIRED when has_partner=true; cityparity does not default this because spouse-per-city working status materially changes the math (e.g. US childcare may exceed a second income, while Nordic subsidies make the second income viable).",
"type": "boolean"
},
"partner_works_in_target": {
"description": "Whether the partner would earn in the target city after relocation. REQUIRED when has_partner=true.",
"type": "boolean"
}
},
"type": "object"
},
"living": {
"additionalProperties": false,
"description": "Housing and spending assumptions. Omit to use defaults: rent, 2 bedrooms, typical spending.",
"properties": {
"bedrooms": {
"description": "Bedroom count for the household. Default 2.",
"maximum": 5,
"minimum": 0,
"type": "integer"
},
"housing_mode": {
"description": "Whether the household rents or owns. Default rent.",
"enum": [
"rent",
"own",
"own_outright"
],
"type": "string"
},
"lifestyle": {
"description": "Spending multiplier on food and discretionary categories. Default typical (1.0\u00d7).",
"enum": [
"frugal",
"typical",
"generous"
],
"type": "string"
}
},
"type": "object"
},
"score_weights": {
"additionalProperties": false,
"description": "Override the composite-score weights. Defaults: financial 30, healthcare 20, vacation 15, childcare 15, safety_net 20.",
"properties": {
"childcare": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"financial": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"healthcare": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"safety_net": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"vacation": {
"maximum": 100,
"minimum": 0,
"type": "number"
}
},
"type": "object"
},
"source_city": {
"description": "City slug for the user's current city. Use list_cities to discover valid slugs (e.g. 'nyc', 'seattle', 'tokyo').",
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"target_city": {
"description": "City slug for the destination city.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"required": [
"source_city",
"target_city",
"gross_salary"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
list_cities |
read | Low | none | Safeguards hinted in metadata. |
Schema & evidence{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"capabilities": [
"read"
],
"input_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"country": {
"description": "Optional case-insensitive country filter. Use the canonical name as stored in city_data.country (e.g. \"Norway\", \"USA\", \"United Kingdom\"). If omitted, returns all countries.",
"maxLength": 64,
"type": "string"
}
},
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
get_city_summary |
read | Low | none | Safeguards hinted in metadata. |
Schema & evidence{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"capabilities": [
"read"
],
"input_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"city": {
"description": "City slug. Use list_cities to discover valid slugs.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"required": [
"city"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
rank_cities |
read | Low | none | Safeguards hinted in metadata. |
Schema & evidence{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"capabilities": [
"read"
],
"input_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"filter": {
"additionalProperties": false,
"description": "Restrict which cities are ranked, by country, region, universal-healthcare flag, or explicit include/exclude slug lists. Omit to rank all supported cities.",
"properties": {
"countries": {
"description": "Restrict to multiple countries.",
"items": {
"maxLength": 64,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"country": {
"description": "Restrict to one country (case-insensitive match against city_data.country, e.g. \"Germany\", \"USA\", \"United Kingdom\").",
"maxLength": 64,
"type": "string"
},
"exclude_cities": {
"description": "Skip these specific city slugs from the result.",
"items": {
"maxLength": 64,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"has_universal_healthcare": {
"description": "If true, only return cities with universal healthcare; if false, only without.",
"type": "boolean"
},
"include_cities": {
"description": "Restrict to a specific set of city slugs. Combined with other filters via intersection.",
"items": {
"maxLength": 64,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"region": {
"description": "Restrict to one region.",
"enum": [
"europe",
"asia",
"north_america",
"south_america",
"oceania"
],
"type": "string"
}
},
"type": "object"
},
"limit": {
"description": "Max results to return. Default 10.",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"scenario": {
"additionalProperties": false,
"description": "Override the default ranking scenario. The same scenario is applied to every city so scores are comparable.",
"properties": {
"bedrooms": {
"description": "Default 2.",
"maximum": 5,
"minimum": 0,
"type": "integer"
},
"gross_salary_usd": {
"description": "USD-equivalent salary to model in each city (converts to local currency). Default 100000.",
"exclusiveMinimum": 0,
"maximum": 5000000,
"type": "number"
},
"has_partner": {
"description": "Default false.",
"type": "boolean"
},
"housing_mode": {
"description": "Default rent.",
"enum": [
"rent",
"own",
"own_outright"
],
"type": "string"
},
"kids_ages": {
"description": "Default [].",
"items": {
"maximum": 25,
"minimum": 0,
"type": "integer"
},
"maxItems": 10,
"type": "array"
},
"lifestyle": {
"description": "Default typical.",
"enum": [
"frugal",
"typical",
"generous"
],
"type": "string"
},
"partner_gross_salary_usd": {
"description": "Required when has_partner=true.",
"maximum": 5000000,
"minimum": 0,
"type": "number"
}
},
"type": "object"
},
"weights": {
"additionalProperties": false,
"description": "Override the composite-score weights. Defaults: financial 30, healthcare 20, vacation 15, childcare 15, safety_net 20.",
"properties": {
"childcare": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"financial": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"healthcare": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"safety_net": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"vacation": {
"maximum": 100,
"minimum": 0,
"type": "number"
}
},
"type": "object"
}
},
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
get_safety_net |
read | Low | none | Safeguards hinted in metadata. |
Schema & evidence{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"capabilities": [
"read"
],
"input_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"cities": {
"description": "Array of city slugs (1-20). Use list_cities to discover valid slugs.",
"items": {
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
}
},
"required": [
"cities"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
get_inbound_tax_regime |
read | Low | none | Safeguards hinted in metadata. |
Schema & evidence{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"capabilities": [
"read"
],
"input_schema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"city": {
"description": "City slug. Use list_cities to discover valid slugs. Most cities return regime=null because their country has no special inbound-worker tax regime.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"required": [
"city"
],
"type": "object"
},
"risk_flags": []
}
Dispute this classification
|
Write-action governance
Status detail: No unsafe write-action governance gaps detected on the latest validation.
| Tool | Risk | Flags | Safeguards |
|---|---|---|---|
| No high-risk tools were detected on the latest run. | |||
Recommended runtime policy
No policy blockers under the default policy stance.
Action-controls diff
New actions
| Action | Risk | Flags |
|---|---|---|
| No newly added actions. | ||
Changed actions
| Action | Change types | Risk |
|---|---|---|
| No materially changed actions. | ||
Critical alerts
Compatibility
Client compatibility verdicts
Client compatibility only means the server shape can work with a client. Production trust decision and write-action publishing are evaluated separately so a client-compatible server can still be blocked for production.
Evidence provenance
initialize• OKtools_list• OKtransport_compliance_probe• Warningstep_up_auth_probe• Missingconnector_replay_probe• OK — Frozen tool snapshots must survive refresh.request_association_probe• Missing — Roots, sampling, and elicitation should stay request-scoped.
Evidence provenance
initialize• OKtools_list• OKtransport_compliance_probe• Warning
Evidence provenance
action_safety_probe• OK
Evidence provenance
tool_snapshot_probe• OKconnector_replay_probe• OK
Client compatibility gate details
Remediation checklist
- Add OAuth-based authentication for remote connector auth.
- Support dynamic client registration (DCR) to simplify connector setup.
- Improve OAuth interoperability -- see the OAuth Interop score breakdown.
- Configure OAuth for authenticated remote MCP access.
- Satisfy OAuth, compatibility, and connector-refresh requirements before using the Messages API remote MCP path.
- Resolve transport compliance issues before wider client rollout.
Remediation checklist
- Configure OAuth for authenticated remote MCP access.
- Satisfy OAuth, compatibility, and connector-refresh requirements before using the Messages API remote MCP path.
- Resolve transport compliance issues before wider client rollout.
Remediation checklist
- No explicit blockers recorded.
Verdict traces
- No active alert triggers.
Client verdict trace table
| Verdict | Status | Checks | Winning source | Conflicts |
|---|---|---|---|---|
openai_connectors |
Not client-compatible | initialize, tools_list, transport_compliance_probe, step_up_auth_probe, connector_replay_probe, request_association_probe | live_validation | none |
claude_desktop |
Not client-compatible | initialize, tools_list, transport_compliance_probe | live_validation | none |
unsafe_for_write_actions |
Publishing allowed | action_safety_probe | live_validation | none |
snapshot_churn_risk |
Low | tool_snapshot_probe, connector_replay_probe | history | none |
Publishability policy profiles
- Search Fetch Only: Yes
- Write Actions Present: No
- Oauth Configured: No
- Admin Refresh Required: No
- Safe For Company Knowledge: Yes
- Safe For Messages Api Remote Mcp: No
- Search Fetch Only: Yes
- Write Actions Present: No
- Oauth Configured: No
- Admin Refresh Required: No
- Safe For Company Knowledge: Yes
- Safe For Messages Api Remote Mcp: No
Compatibility fixtures
- remote_http_endpoint: Passes
- oauth_discovery: Degraded
- frozen_tool_snapshot_refresh: Passes
- request_association: Not Assessed
- remote_transport: Passes
- tool_discovery: Passes
- auth_connect: Passes
- safe_write_review: Passes
Recommended for
Evidence
Current trust snapshot
trustsnap_9e83613047a3591bCanonical machine links
Evidence confidence
Latest validation evidence
Failures
oauth_authorization_serverno authorization serveroauth_protected_resourceClient error '404 Not Found' for url 'https://mcp.cityparity.com/.well-known/oauth-protected-resource' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404openid_configurationno authorization serverserver_cardClient error '404 Not Found' for url 'https://mcp.cityparity.com/.well-known/mcp/server-card.json' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404
Checks
| Check | Status | Latency | Evidence |
|---|---|---|---|
action_safety_probe |
OK | n/a | No high-risk write, destructive, or exec tools detected. |
advanced_capabilities_probe |
Warning | n/a | Only 1 capability signal(s): structured outputs. |
connector_publishability_probe |
Warning | n/a | Publishability blockers: step up auth, request association, server card. |
connector_replay_probe |
OK | n/a | Backward compatible with no breaking tool-surface changes. |
determinism_probe |
OK | 111.8 ms | Check completed |
initialize |
OK | 40.0 ms | Protocol 2025-03-26 |
interactive_flow_probe |
Missing | n/a | Check completed |
oauth_authorization_server |
Missing | n/a | no authorization server |
oauth_protected_resource |
Error | 28.9 ms | Client error '404 Not Found' for url 'https://mcp.cityparity.com/.well-known/oauth-protected-resource' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404 |
official_registry_probe |
Missing | n/a | Check completed |
openid_configuration |
Missing | n/a | no authorization server |
probe_noise_resilience |
OK | 184.9 ms | Fetched https://mcp.cityparity.com/robots.txt |
prompt_get |
Missing | n/a | not advertised |
prompts_list |
Missing | 98.4 ms | not supported |
protocol_version_probe |
Warning | n/a | Claims 2025-03-26; 2 release(s) behind 2025-11-25. |
provenance_divergence_probe |
Not_Assessed | n/a | Check completed |
request_association_probe |
Missing | n/a | No request-association capabilities were advertised. |
resource_read |
Missing | n/a | not advertised |
resources_list |
Missing | 268.2 ms | not supported |
schema_divergence_probe |
Missing | n/a | no server card tools |
server_card |
Error | 32.6 ms | Client error '404 Not Found' for url 'https://mcp.cityparity.com/.well-known/mcp/server-card.json' For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404 |
session_resume_probe |
Warning | n/a | no session id |
step_up_auth_probe |
Missing | n/a | No OAuth or incremental-scope signals detected. |
tool_snapshot_probe |
OK | n/a | Check completed |
tools_list |
OK | 54.2 ms | 6 tool(s) exposed |
transport_compliance_probe |
Warning | 28.6 ms | Issues: missing session id, missing protocol header (bad protocol=400). |
utility_coverage_probe |
Missing | 14.4 ms | No completions evidence; no pagination evidence; tasks missing. |
Known versions
- No versions recorded.
Public server reputation
Benchmark tasks
| Benchmark task | Status | Evidence |
|---|---|---|
| Discover tools | Passes |
|
| Read-only fetch flow | Degraded |
|
| OAuth-required connect | Degraded |
|
| Safe write flow with confirmation | Passes |
|
Utility coverage
Tool snapshot diff & changelog
Required-argument changes
| Tool | Added required args | Removed required args |
|---|---|---|
| No required-argument changes detected. | ||
Output-schema drift
| Tool | Previous properties | Latest properties |
|---|---|---|
| No output-schema drift detected. | ||
Validation diff
Regressed checks: none
Improved checks: none
Newly assessed dimensions: none
No longer assessed dimensions: none
| Component | Previous | Latest | Delta |
|---|---|---|---|
| No component deltas between the latest two runs. | |||
Registry & provenance divergence
| Field | Registry | Live server card |
|---|---|---|
| Title | n/a | n/a |
| Version | n/a | n/a |
| Homepage | n/a | n/a |
Active alerts
No active alerts for the current server state.
Aliases & registry graph
| Identifier | Source | Canonical | Identity evidence | Score |
|---|---|---|---|---|
summerstateofmind/cityparity |
glama_registry | yes | canonical | 63.0 |
awesome-summerstateofmind/cityparity |
awesome_mcp_servers | no | repo_slug | n/a |
Alias consolidation
Strong alias identity requires matching remote URL, server-card URL, repository slug, or explicit registry cross-reference; shared provider namespace alone is not identity.
Source disagreements
| Field | What differs | Observed values |
|---|---|---|
| Registry source | Multiple registries or registry sync paths claim this same canonical server. | awesome_mcp_servers glama_registry |
| Remote URL | Aliases currently point at different MCP endpoints, which can indicate mirrors, stale registry data, or a real endpoint split. | https://glama.ai/mcp/servers/summerstateofmind/cityparity/badges/score.svg)](https://glama.ai/mcp/servers/summerstateofmind/cityparity https://mcp.cityparity.com/mcp |
| Homepage | Registry entries disagree on the primary homepage for this server. | https://github.com/summerstateofmind/cityparity https://glama.ai/mcp/servers/rz9eujy2ov |
| Registry identifier | Different registry-specific identifiers resolve to the same canonical server record here. | awesome_mcp_servers:summerstateofmind/cityparity glama_registry:rz9eujy2ov |
Fix it
Why this score?
Algorithmic score breakdown
1 component(s) not assessed for this run: Provenance Divergence
Experimental candidate components
Actionable remediation
| Severity | Remediation | Why it matters | Recommended action |
|---|---|---|---|
| High | Align session and protocol behavior with Streamable HTTP expectations | Clients increasingly rely on MCP-Protocol-Version, session teardown, and expired-session semantics. | Align MCP-Protocol-Version, MCP-Session-Id, DELETE teardown, and expired-session handling with the transport spec.Playbook
|
| High | Expose /.well-known/oauth-protected-resource | Without a protected-resource document, OAuth clients cannot discover auth requirements reliably. | Serve /.well-known/oauth-protected-resource and point it at your authorization server metadata.Playbook
|
| High | Publish OAuth authorization-server metadata | Clients need authorization-server metadata to discover issuer, endpoints, and DCR support. | Publish /.well-known/oauth-authorization-server from your issuer and include registration_endpoint when supported.Playbook
|
| High | Publish a complete server card | Missing or incomplete server-card metadata weakens discovery, documentation, and trust signals. | Serve /.well-known/mcp/server-card.json and include tools, prompts/resources, homepage, and support links.Playbook
|
| Medium | Adopt a current MCP protocol revision | Older protocol revisions reduce compatibility with newer clients and registry programs. | Advertise a current MCP protocol revision (2025-06-18 or later) in both the initialize response and the MCP-Protocol-Version header.Playbook
|
| Medium | Close connector-publishing gaps | Connector catalogs care about protocol recency, session behavior, auth clarity, and tool-surface stability. | Close connector-publishing gaps |
| Medium | Document minimal scopes and return cleaner auth challenges | Modern clients expect granular scopes and step-up auth signals such as WWW-Authenticate scope hints. | Return granular scopes and WWW-Authenticate challenge hints instead of forcing overly broad auth upfront.Playbook
|
| Medium | Publish OpenID configuration | OIDC metadata improves token validation and client compatibility. | Expose /.well-known/openid-configuration with issuer, jwks_uri, and supported grants.Playbook
|
| Medium | Support resumable HTTP sessions cleanly | Modern MCP clients increasingly expect resumable session behavior on streamable HTTP transports. | Persist session state keyed by Mcp-Session-Id and honor Last-Event-ID on GET reconnects so clients can resume a dropped Streamable HTTP session.Playbook
|
| Low | Expose modern utility surfaces like completions, pagination, or tasks | Utility coverage improves interoperability with larger clients and long-lived agent workflows. | Expose completions, pagination, and task metadata where supported so larger clients can plan and resume work safely.Playbook
|
| Low | Publish newer MCP capability signals | Roots, sampling, elicitation, structured outputs, and related metadata improve client understanding and ranking. | Advertise only the advanced capabilities (roots, sampling, elicitation) you have actually implemented end to end in the initialize capabilities object.Playbook
|
| Low | Publish or reconcile the server in the official MCP registry | Official registry presence improves discovery confidence and cross-source consistency. | Publish or reconcile the server in the official MCP registry |
Point loss breakdown
| Component | Current | Points missing |
|---|---|---|
| Utility Coverage | 0/4 | -4.0 |
| Step-Up Auth | 0/4 | -4.0 |
| Resource Contract | 0/4 | -4.0 |
| Request Association | 0/4 | -4.0 |
| Recovery Semantics | 0/4 | -4.0 |
| Prompt Contract | 0/4 | -4.0 |
| OAuth Interop | 0/4 | -4.0 |
| Interactive Flow Safety | 0/4 | -4.0 |
| Supply Chain Signal | 0/4 | -4.0 |
| Advanced Capability Coverage | 0/4 | -4.0 |
| Transport Compliance | 2/4 | -2.0 |
| Spec Recency | 2/4 | -2.0 |
Compatibility profiles
Connector URL: https://mcp.cityparity.com/mcp # No OAuth metadata detected. # Server: summerstateofmind/cityparity
{
"mcpServers": {
"cityparity": {
"command": "npx",
"args": ["mcp-remote", "https://mcp.cityparity.com/mcp"]
}
}
}
smithery mcp add "https://mcp.cityparity.com/mcp"
curl -sS https://mcp.cityparity.com/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'
Governance
MCP TrustOps
TrustOps turns this report into operational controls: validation targets and SLAs, authenticated validation, semantic benchmarks, policy exports, alert subscriptions, badges, cost/compliance metadata, and runtime routing. Fresh trusted index decisions stay separate from long-tail inventory so stale scores do not masquerade as current evidence.
/v1/decideAlert subscription types
MCP Runtime hosting
Verify Hosted MCP turns a trusted server report into a managed remote MCP endpoint with GitHub deployment provenance, sandbox policy, encrypted secrets, release history, rollback, and audit/usage events.
/hosted/{namespace}/{name}/mcp| Deployment | Status | Endpoint | Release |
|---|---|---|---|
| No hosted runtime deployments yet. | |||
Authenticated validation sessions
Public validation is free. Authenticated validation is paid and proves scoped behavior, write-action safeguards, and authenticated tool execution.
/v1/verify/v1/ci/previewInstall snippets
Connector URL: https://mcp.cityparity.com/mcp # No OAuth metadata detected. # Server: summerstateofmind/cityparity
{
"mcpServers": {
"cityparity": {
"command": "npx",
"args": ["mcp-remote", "https://mcp.cityparity.com/mcp"]
}
}
}
smithery mcp add "https://mcp.cityparity.com/mcp"
curl -sS https://mcp.cityparity.com/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"mcp-verify","version":"0.1.0"}}}'
Agent access & tool surface
tools/list, prompts/list, and resources/list checks.summerstateofmind/cityparity.History
Validation history
| Timestamp | Status | Score | Latency | Tools |
|---|---|---|---|---|
| Aug 12, 2026 08:12:24 PM UTC | Healthy | 63.0 | 1100.7 ms | 6 |
| Aug 12, 2026 08:10:08 PM UTC | Healthy | 63.0 | 1578.8 ms | 6 |
| Aug 12, 2026 07:57:21 AM UTC | Healthy | 62.5 | 1427.5 ms | 6 |
| Aug 11, 2026 07:27:13 PM UTC | Healthy | 62.5 | 1990.0 ms | 6 |
| Aug 11, 2026 07:23:28 AM UTC | Healthy | 62.5 | 1268.5 ms | 6 |
| Aug 10, 2026 07:22:55 PM UTC | Healthy | 62.5 | 1568.5 ms | 6 |
| Aug 10, 2026 07:22:24 AM UTC | Healthy | 62.5 | 1294.8 ms | 6 |
| Aug 09, 2026 07:16:58 PM UTC | Healthy | 62.5 | 1327.1 ms | 6 |
| Aug 09, 2026 07:16:49 AM UTC | Healthy | 62.5 | 1221.8 ms | 6 |
| Aug 08, 2026 07:16:28 PM UTC | Healthy | 62.5 | 1641.9 ms | 6 |
Validation timeline
| Validated | Summary | Score | Protocol | Auth mode | Tools | High-risk tools | Changes |
|---|---|---|---|---|---|---|---|
| Aug 12, 2026 08:12:24 PM UTC | Healthy | 63.0 | 2025-03-26 | public | 6 | 0 | none |
| Aug 12, 2026 08:10:08 PM UTC | Healthy | 63.0 | 2025-03-26 | public | 6 | 0 | none |
| Aug 12, 2026 07:57:21 AM UTC | Healthy | 62.5 | 2025-03-26 | public | 6 | 0 | none |
| Aug 11, 2026 07:27:13 PM UTC | Healthy | 62.5 | 2025-03-26 | public | 6 | 0 | none |
| Aug 11, 2026 07:23:28 AM UTC | Healthy | 62.5 | 2025-03-26 | public | 6 | 0 | none |
| Aug 10, 2026 07:22:55 PM UTC | Healthy | 62.5 | 2025-03-26 | public | 6 | 0 | none |
| Aug 10, 2026 07:22:24 AM UTC | Healthy | 62.5 | 2025-03-26 | public | 6 | 0 | none |
| Aug 09, 2026 07:16:58 PM UTC | Healthy | 62.5 | 2025-03-26 | public | 6 | 0 | none |
| Aug 09, 2026 07:16:49 AM UTC | Healthy | 62.5 | 2025-03-26 | public | 6 | 0 | none |
| Aug 08, 2026 07:16:28 PM UTC | Healthy | 62.5 | 2025-03-26 | public | 6 | 0 | none |
Recent validation runs
| Started | Status | Summary | Latency | Checks |
|---|---|---|---|---|
| Aug 12, 2026 08:12:23 PM UTC | Completed | Healthy | 1100.7 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 12, 2026 08:10:06 PM UTC | Completed | Healthy | 1578.8 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 12, 2026 07:57:19 AM UTC | Completed | Healthy | 1427.5 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 11, 2026 07:27:11 PM UTC | Completed | Healthy | 1990.0 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 11, 2026 07:23:27 AM UTC | Completed | Healthy | 1268.5 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 10, 2026 07:22:53 PM UTC | Completed | Healthy | 1568.5 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 10, 2026 07:22:23 AM UTC | Completed | Healthy | 1294.8 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 09, 2026 07:16:56 PM UTC | Completed | Healthy | 1327.1 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 09, 2026 07:16:48 AM UTC | Completed | Healthy | 1221.8 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
| Aug 08, 2026 07:16:27 PM UTC | Completed | Healthy | 1641.9 ms | action_safety_probe, advanced_capabilities_probe, connector_publishability_probe, connector_replay_probe, determinism_probe, initialize, interactive_flow_probe, oauth_authorization_server, oauth_protected_resource, official_registry_probe, openid_configuration, probe_noise_resilience, prompt_get, prompts_list, protocol_version_probe, provenance_divergence_probe, request_association_probe, resource_read, resources_list, schema_divergence_probe, server_card, session_resume_probe, step_up_auth_probe, tool_snapshot_probe, tools_list, transport_compliance_probe, utility_coverage_probe |
Incident & change feed
| Timestamp | Event | Details |
|---|---|---|
| Aug 12, 2026 08:12:24 PM UTC | Latest validation: healthy | Score 63.0 with status healthy. |
| Aug 12, 2026 08:10:08 PM UTC | Score changed | Score delta +0.5 versus the previous run. |
Technical details
Raw evidence view
Show raw JSON evidence
{
"checks": {
"action_safety_probe": {
"details": {
"auth_present": false,
"confirmation_signals": [],
"reason": null,
"safeguard_count": 6,
"summary": {
"annotation_conflict_tools": 0,
"bulk_access_tools": 0,
"capability_distribution": {
"read": 6
},
"declared_non_read_only_tools": 0,
"destructive_tools": 0,
"egress_tools": 0,
"exec_tools": 0,
"has_mutating_capability": false,
"has_non_read_capability": false,
"high_risk_tools": 0,
"risk_distribution": {
"critical": 0,
"high": 0,
"low": 6,
"medium": 0
},
"secret_tools": 0,
"tool_count": 6
}
},
"latency_ms": null,
"status": "ok"
},
"advanced_capabilities_probe": {
"details": {
"capabilities": {
"completions": false,
"elicitation": false,
"prompts": false,
"resource_links": false,
"resources": false,
"roots": false,
"sampling": false,
"structured_outputs": true
},
"enabled": [
"structured_outputs"
],
"enabled_count": 1,
"initialize_capability_keys": [
"tools"
]
},
"latency_ms": null,
"status": "warning"
},
"connector_publishability_probe": {
"details": {
"blockers": [
"step_up_auth",
"request_association",
"server_card"
],
"criteria": {
"action_safety": true,
"auth_flow": true,
"connector_replay": true,
"initialize": true,
"protocol_version": true,
"remote_transport": true,
"request_association": false,
"server_card": false,
"session_resume": true,
"step_up_auth": false,
"tool_surface": true,
"tools_list": true,
"transport_compliance": true
},
"high_risk_tools": 0,
"tool_count": 6,
"transport": "streamable-http"
},
"latency_ms": null,
"status": "warning"
},
"connector_replay_probe": {
"details": {
"added_tools": [],
"additive_output_changes": [],
"backward_compatible": true,
"output_breaks": [],
"removed_tools": [],
"required_arg_breaks": [],
"would_break_after_refresh": false
},
"latency_ms": null,
"status": "ok"
},
"determinism_probe": {
"details": {
"attempts": 2,
"baseline_signature": "2a8662858bef47f4fffb5603e75b27728e5f0c81bc5f3258703ed551b7122456",
"errors": [],
"matches": 2,
"stable_ratio": 1.0,
"successful": 2
},
"latency_ms": 111.78,
"status": "ok"
},
"initialize": {
"details": {
"headers": {
"content-type": "text/event-stream"
},
"http_status": 200,
"payload": {
"id": 1,
"jsonrpc": "2.0",
"result": {
"capabilities": {
"tools": {
"listChanged": true
}
},
"instructions": "Call list_cities first to discover valid city slugs. compare_cities is the primary tool; use get_city_summary or get_safety_net for single-city queries. RSU income is treated as source-only and is not a parameter. Methodology: https://cityparity.com/#methodology",
"protocolVersion": "2025-03-26",
"serverInfo": {
"name": "cityparity",
"title": "cityparity cost-of-living tools",
"version": "0.1.0"
}
}
},
"url": "https://mcp.cityparity.com/mcp"
},
"latency_ms": 39.95,
"status": "ok"
},
"interactive_flow_probe": {
"details": {
"oauth_supported": false,
"prompt_available": false,
"risk_hits": [],
"safe_hits": []
},
"latency_ms": null,
"status": "missing"
},
"oauth_authorization_server": {
"details": {
"reason": "no_authorization_server"
},
"latency_ms": null,
"status": "missing"
},
"oauth_protected_resource": {
"details": {
"error": "Client error '404 Not Found' for url 'https://mcp.cityparity.com/.well-known/oauth-protected-resource'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://mcp.cityparity.com/.well-known/oauth-protected-resource"
},
"latency_ms": 28.88,
"status": "error"
},
"official_registry_probe": {
"details": {
"direct_match": false,
"official_peer_count": 0,
"registry_source": "glama_registry"
},
"latency_ms": null,
"status": "missing"
},
"openid_configuration": {
"details": {
"reason": "no_authorization_server"
},
"latency_ms": null,
"status": "missing"
},
"probe_noise_resilience": {
"details": {
"consent_error": null,
"headers": {
"content-type": "text/plain; charset=utf-8"
},
"http_status": 200,
"url": "https://mcp.cityparity.com/robots.txt",
"validation_disallowed": false
},
"latency_ms": 184.94,
"status": "ok"
},
"prompt_get": {
"details": {
"reason": "not_advertised"
},
"latency_ms": null,
"status": "missing"
},
"prompts_list": {
"details": {
"headers": {
"content-type": "text/event-stream"
},
"http_status": 200,
"payload": {
"error": {
"code": -32601,
"message": "Method not found"
},
"id": 3,
"jsonrpc": "2.0"
},
"reason": "not_supported",
"url": "https://mcp.cityparity.com/mcp"
},
"latency_ms": 98.43,
"status": "missing"
},
"protocol_version_probe": {
"details": {
"claimed_version": "2025-03-26",
"lag_days": 244,
"latest_known_version": "2025-11-25",
"releases_behind": 2,
"validator_protocol_version": "2025-03-26"
},
"latency_ms": null,
"status": "warning"
},
"provenance_divergence_probe": {
"details": {
"comparable_field_count": 0,
"compared_fields": [
"title",
"version",
"homepage",
"repository"
],
"direct_official_match": false,
"drift_fields": [],
"metadata_document_count": 1,
"readable_sources": [],
"registry_homepage": null,
"registry_repository": null,
"registry_title": null,
"registry_version": null,
"server_card_homepage": null,
"server_card_repository": null,
"server_card_title": null,
"server_card_version": null
},
"latency_ms": null,
"status": "not_assessed"
},
"request_association_probe": {
"details": {
"reason": "no_request_association_capabilities_advertised"
},
"latency_ms": null,
"status": "missing"
},
"resource_read": {
"details": {
"reason": "not_advertised"
},
"latency_ms": null,
"status": "missing"
},
"resources_list": {
"details": {
"headers": {
"content-type": "text/event-stream"
},
"http_status": 200,
"payload": {
"error": {
"code": -32601,
"message": "Method not found"
},
"id": 5,
"jsonrpc": "2.0"
},
"reason": "not_supported",
"url": "https://mcp.cityparity.com/mcp"
},
"latency_ms": 268.2,
"status": "missing"
},
"schema_divergence_probe": {
"details": {
"auth_scheme_mismatch": false,
"card_server_name": null,
"card_server_version": null,
"compared_dimensions": [
"server_name",
"server_version",
"declared_vs_observed_auth",
"tool_membership",
"parameter_names",
"required_parameters",
"parameter_types",
"output_schema_presence"
],
"compared_tool_count": 0,
"live_server_name": "cityparity",
"live_server_version": "0.1.0",
"reason": "no_server_card_tools",
"server_name_mismatch": false,
"server_version_mismatch": false
},
"latency_ms": null,
"status": "missing"
},
"server_card": {
"details": {
"error": "Client error '404 Not Found' for url 'https://mcp.cityparity.com/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://mcp.cityparity.com/.well-known/mcp/server-card.json"
},
"latency_ms": 32.56,
"status": "error"
},
"session_resume_probe": {
"details": {
"protocol_version": "2025-03-26",
"reason": "no_session_id",
"resume_expected": true,
"transport": "streamable-http"
},
"latency_ms": null,
"status": "warning"
},
"step_up_auth_probe": {
"details": {
"auth_required_checks": [],
"broad_scopes": [],
"challenge_headers": [],
"minimal_scope_documented": false,
"oauth_present": false,
"scope_specificity_ratio": 0.0,
"step_up_signals": [],
"supported_scopes": []
},
"latency_ms": null,
"status": "missing"
},
"tool_snapshot_probe": {
"details": {
"added": [],
"changed_outputs": [],
"current_tool_count": 6,
"previous_tool_count": 6,
"removed": [],
"similarity": 1.0
},
"latency_ms": null,
"status": "ok"
},
"tools_list": {
"details": {
"headers": {
"content-type": "text/event-stream"
},
"http_status": 200,
"payload": {
"id": 2,
"jsonrpc": "2.0",
"result": {
"tools": [
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Compare two cities for one household: take-home pay, full cost breakdown, the equivalent target salary needed to match source net cash, non-cash lifestyle deltas (vacation, parental leave, healthcare), and a 0-100 quality score on five weighted dimensions. Use this for a head-to-head between two named cities; for a single city call get_city_summary, and to rank many cities call rank_cities. Read-only, no side effects; returns a text summary plus structured JSON. RSU income is NOT a parameter; RSU is treated as source-only because grants typically do not follow you across employers.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"advanced": {
"additionalProperties": false,
"description": "Optional fine-tuning: retirement contribution, age bracket, trips home, transit mode, and inbound tax regime. Omit to use defaults.",
"properties": {
"age_bracket": {
"description": "Affects US healthcare premium multipliers. Default 25-34.",
"enum": [
"18-24",
"25-34",
"35-44",
"45-54",
"55-64"
],
"type": "string"
},
"apply_inbound_regime": {
"description": "Apply the destination country's special inbound-worker tax regime if available (Italy impatriati, Portugal IFICI, Belgium expat, Poland B2B rycza\u0142t, Greece inbound). Default false. Applies only on the target side.",
"type": "boolean"
},
"retirement_contrib_pct": {
"description": "Percentage of gross diverted to retirement (pre-tax for US 401k). Default 6.",
"maximum": 50,
"minimum": 0,
"type": "number"
},
"source_transit_choice": {
"description": "Default depends on city; e.g. Seattle defaults to 'car', Oslo defaults to 'transit'.",
"enum": [
"car",
"transit"
],
"type": "string"
},
"target_transit_choice": {
"description": "Same as above for the target city.",
"enum": [
"car",
"transit"
],
"type": "string"
},
"trips_home_per_year": {
"description": "Round trips back to source country per year (target-only cost). Default 1.",
"maximum": 12,
"minimum": 0,
"type": "integer"
}
},
"type": "object"
},
"gross_salary": {
"description": "User's annual gross salary in the SOURCE city's local currency (e.g. USD for Seattle, NOK for Oslo).",
"exclusiveMinimum": 0,
"maximum": 50000000,
"type": "number"
},
"household": {
"additionalProperties": false,
"description": "Family structure: working-age partner and dependent children. Omit for a single person with no kids.",
"properties": {
"has_partner": {
"description": "Whether the user has a working-age partner. Defaults to false.",
"type": "boolean"
},
"kids_ages": {
"description": "Ages of dependent children, e.g. [3, 7]. Empty array or omitted if no kids.",
"items": {
"maximum": 25,
"minimum": 0,
"type": "integer"
},
"maxItems": 10,
"type": "array"
},
"partner_gross_salary": {
"description": "Partner's annual gross salary in the SOURCE city's currency. REQUIRED when has_partner=true.",
"maximum": 50000000,
"minimum": 0,
"type": "number"
},
"partner_works_in_source": {
"description": "Whether the partner currently earns in the source city. REQUIRED when has_partner=true; cityparity does not default this because spouse-per-city working status materially changes the math (e.g. US childcare may exceed a second income, while Nordic subsidies make the second income viable).",
"type": "boolean"
},
"partner_works_in_target": {
"description": "Whether the partner would earn in the target city after relocation. REQUIRED when has_partner=true.",
"type": "boolean"
}
},
"type": "object"
},
"living": {
"additionalProperties": false,
"description": "Housing and spending assumptions. Omit to use defaults: rent, 2 bedrooms, typical spending.",
"properties": {
"bedrooms": {
"description": "Bedroom count for the household. Default 2.",
"maximum": 5,
"minimum": 0,
"type": "integer"
},
"housing_mode": {
"description": "Whether the household rents or owns. Default rent.",
"enum": [
"rent",
"own",
"own_outright"
],
"type": "string"
},
"lifestyle": {
"description": "Spending multiplier on food and discretionary categories. Default typical (1.0\u00d7).",
"enum": [
"frugal",
"typical",
"generous"
],
"type": "string"
}
},
"type": "object"
},
"score_weights": {
"additionalProperties": false,
"description": "Override the composite-score weights. Defaults: financial 30, healthcare 20, vacation 15, childcare 15, safety_net 20.",
"properties": {
"childcare": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"financial": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"healthcare": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"safety_net": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"vacation": {
"maximum": 100,
"minimum": 0,
"type": "number"
}
},
"type": "object"
},
"source_city": {
"description": "City slug for the user's current city. Use list_cities to discover valid slugs (e.g. 'nyc', 'seattle', 'tokyo').",
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"target_city": {
"description": "City slug for the destination city.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"required": [
"source_city",
"target_city",
"gross_salary"
],
"type": "object"
},
"name": "compare_cities",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"equivalence": {
"additionalProperties": false,
"properties": {
"explanation": {
"type": "string"
},
"household_gross": {
"type": [
"number",
"null"
]
},
"status": {
"enum": [
"solved",
"no_solution"
],
"type": "string"
},
"target_salary_needed": {
"type": [
"number",
"null"
]
}
},
"required": [
"status",
"target_salary_needed",
"household_gross",
"explanation"
],
"type": "object"
},
"meta": {
"additionalProperties": true,
"properties": {},
"type": "object"
},
"non_cash_deltas": {
"items": {
"additionalProperties": false,
"properties": {
"delta": {
"type": "number"
},
"direction": {
"enum": [
"up",
"down"
],
"type": "string"
},
"metric": {
"type": "string"
},
"note": {
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"direction",
"metric",
"delta",
"text"
],
"type": "object"
},
"type": "array"
},
"quality_score": {
"additionalProperties": true,
"properties": {},
"type": "object"
},
"source": {
"additionalProperties": false,
"properties": {
"after_tax_income": {
"type": "number"
},
"city": {
"type": "string"
},
"costs": {
"additionalProperties": false,
"properties": {
"childcare": {
"type": "number"
},
"discretionary": {
"type": "number"
},
"food": {
"type": "number"
},
"healthcare": {
"type": "number"
},
"housing": {
"type": "number"
},
"property_tax": {
"type": "number"
},
"transit": {
"type": "number"
},
"travel_home": {
"type": "number"
}
},
"required": [
"housing",
"healthcare",
"childcare",
"food",
"transit",
"discretionary",
"travel_home",
"property_tax"
],
"type": "object"
},
"currency": {
"type": "string"
},
"effective_tax_rate": {
"type": "number"
},
"govt_benefits": {
"type": "number"
},
"gross_income": {
"type": "number"
},
"net_cash_annual": {
"type": "number"
},
"slug": {
"type": "string"
},
"taxes": {
"additionalProperties": true,
"properties": {},
"type": "object"
}
},
"required": [
"city",
"slug",
"currency",
"gross_income",
"effective_tax_rate",
"after_tax_income",
"taxes",
"costs",
"govt_benefits",
"net_cash_annual"
],
"type": "object"
},
"target": {
"$ref": "#/properties/source"
}
},
"required": [
"source",
"target",
"equivalence",
"non_cash_deltas",
"quality_score",
"meta"
],
"type": "object"
},
"title": "Compare two cities for a household"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "List all city slugs supported by cityparity, grouped by country. Call this first to discover valid slugs before any other tool; the optional country filter narrows to one country. Read-only, no side effects; returns a text summary plus structured JSON.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"country": {
"description": "Optional case-insensitive country filter. Use the canonical name as stored in city_data.country (e.g. \"Norway\", \"USA\", \"United Kingdom\"). If omitted, returns all countries.",
"maxLength": 64,
"type": "string"
}
},
"type": "object"
},
"name": "list_cities",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"count": {
"type": "integer"
},
"country_count": {
"type": "integer"
},
"groups": {
"items": {
"additionalProperties": false,
"properties": {
"cities": {
"items": {
"additionalProperties": false,
"properties": {
"name": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"name"
],
"type": "object"
},
"type": "array"
},
"country": {
"type": "string"
}
},
"required": [
"country",
"cities"
],
"type": "object"
},
"type": "array"
}
},
"required": [
"count",
"country_count",
"groups"
],
"type": "object"
},
"title": "List supported cities by country"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Concise profile of one city: currency, tax shape (bracket count + top rate + payroll/national insurance), headline costs (rent / groceries / transit / childcare), safety-net values (parental leave, vacation, universal healthcare), and data freshness. Lighter than compare_cities; use when the user is asking about one place rather than a comparison. On parental leave, quote safety_net.parental_leave_summary rather than building your own sentence: some countries (Ireland, Australia, the UK, Czechia, part of Sweden) pay a flat weekly cash sum instead of a share of salary, so parental_leave_paid_pct is 0 or partial for them and stating it alone would wrongly call their leave unpaid. Read-only, no side effects; returns a text summary plus structured JSON.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"city": {
"description": "City slug. Use list_cities to discover valid slugs.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"required": [
"city"
],
"type": "object"
},
"name": "get_city_summary",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"compensation_index": {
"type": [
"number",
"null"
]
},
"cost_snapshot": {
"additionalProperties": true,
"properties": {},
"type": "object"
},
"country": {
"type": "string"
},
"currency": {
"type": "string"
},
"data_last_updated_field": {
"type": [
"string",
"null"
]
},
"data_year_range": {
"type": [
"string",
"null"
]
},
"govt_benefits": {
"additionalProperties": true,
"properties": {},
"type": "object"
},
"inbound_tax_regime": {
"anyOf": [
{
"additionalProperties": true,
"properties": {},
"type": "object"
},
{
"type": "null"
}
]
},
"methodology_url": {
"type": "string"
},
"name": {
"type": "string"
},
"safety_net": {
"additionalProperties": true,
"properties": {},
"type": "object"
},
"slug": {
"type": "string"
},
"tax": {
"additionalProperties": true,
"properties": {},
"type": "object"
}
},
"required": [
"slug",
"name",
"country",
"currency",
"compensation_index",
"tax",
"cost_snapshot",
"safety_net",
"govt_benefits",
"inbound_tax_regime",
"data_last_updated_field",
"data_year_range",
"methodology_url"
],
"type": "object"
},
"title": "Get a one-city profile"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Rank supported cities by composite quality-of-life score across five weighted dimensions (financial, healthcare, vacation, childcare, safety_net). Returns top N (default 10), with filters for country, countries, region (europe/asia/north_america/south_america/oceania), has_universal_healthcare, include_cities, and exclude_cities. Use this to shortlist across many cities; for a head-to-head between two named cities use compare_cities. The same scenario is applied to every city so scores are directly comparable (default: single person, 2BR rent, $100k USD-equivalent gross). Read-only, no side effects; returns a text summary plus structured JSON.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"filter": {
"additionalProperties": false,
"description": "Restrict which cities are ranked, by country, region, universal-healthcare flag, or explicit include/exclude slug lists. Omit to rank all supported cities.",
"properties": {
"countries": {
"description": "Restrict to multiple countries.",
"items": {
"maxLength": 64,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"country": {
"description": "Restrict to one country (case-insensitive match against city_data.country, e.g. \"Germany\", \"USA\", \"United Kingdom\").",
"maxLength": 64,
"type": "string"
},
"exclude_cities": {
"description": "Skip these specific city slugs from the result.",
"items": {
"maxLength": 64,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"has_universal_healthcare": {
"description": "If true, only return cities with universal healthcare; if false, only without.",
"type": "boolean"
},
"include_cities": {
"description": "Restrict to a specific set of city slugs. Combined with other filters via intersection.",
"items": {
"maxLength": 64,
"type": "string"
},
"maxItems": 100,
"type": "array"
},
"region": {
"description": "Restrict to one region.",
"enum": [
"europe",
"asia",
"north_america",
"south_america",
"oceania"
],
"type": "string"
}
},
"type": "object"
},
"limit": {
"description": "Max results to return. Default 10.",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"scenario": {
"additionalProperties": false,
"description": "Override the default ranking scenario. The same scenario is applied to every city so scores are comparable.",
"properties": {
"bedrooms": {
"description": "Default 2.",
"maximum": 5,
"minimum": 0,
"type": "integer"
},
"gross_salary_usd": {
"description": "USD-equivalent salary to model in each city (converts to local currency). Default 100000.",
"exclusiveMinimum": 0,
"maximum": 5000000,
"type": "number"
},
"has_partner": {
"description": "Default false.",
"type": "boolean"
},
"housing_mode": {
"description": "Default rent.",
"enum": [
"rent",
"own",
"own_outright"
],
"type": "string"
},
"kids_ages": {
"description": "Default [].",
"items": {
"maximum": 25,
"minimum": 0,
"type": "integer"
},
"maxItems": 10,
"type": "array"
},
"lifestyle": {
"description": "Default typical.",
"enum": [
"frugal",
"typical",
"generous"
],
"type": "string"
},
"partner_gross_salary_usd": {
"description": "Required when has_partner=true.",
"maximum": 5000000,
"minimum": 0,
"type": "number"
}
},
"type": "object"
},
"weights": {
"additionalProperties": false,
"description": "Override the composite-score weights. Defaults: financial 30, healthcare 20, vacation 15, childcare 15, safety_net 20.",
"properties": {
"childcare": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"financial": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"healthcare": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"safety_net": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"vacation": {
"maximum": 100,
"minimum": 0,
"type": "number"
}
},
"type": "object"
}
},
"type": "object"
},
"name": "rank_cities",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"considered": {
"type": "integer"
},
"methodology_url": {
"type": "string"
},
"ranked": {
"items": {
"additionalProperties": false,
"properties": {
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"currency": {
"type": "string"
},
"dimensions": {
"additionalProperties": false,
"properties": {
"childcare": {
"type": "number"
},
"financial": {
"type": "number"
},
"healthcare": {
"type": "number"
},
"safety_net": {
"type": "number"
},
"vacation": {
"type": "number"
}
},
"required": [
"financial",
"healthcare",
"vacation",
"childcare",
"safety_net"
],
"type": "object"
},
"effective_tax_rate": {
"type": "number"
},
"net_cash_annual_local": {
"type": "number"
},
"net_cash_annual_usd": {
"type": "number"
},
"parental_leave_weeks": {
"type": [
"number",
"null"
]
},
"rank": {
"type": "integer"
},
"slug": {
"type": "string"
},
"total_score": {
"type": "number"
},
"universal_healthcare": {
"type": "boolean"
}
},
"required": [
"rank",
"slug",
"city",
"country",
"currency",
"total_score",
"dimensions",
"net_cash_annual_local",
"net_cash_annual_usd",
"effective_tax_rate",
"universal_healthcare"
],
"type": "object"
},
"type": "array"
},
"scenario_used": {
"additionalProperties": true,
"properties": {},
"type": "object"
},
"skipped": {
"items": {
"additionalProperties": false,
"properties": {
"reason": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"reason"
],
"type": "object"
},
"type": "array"
},
"weights": {
"additionalProperties": true,
"properties": {},
"type": "object"
}
},
"required": [
"ranked",
"considered",
"skipped",
"weights",
"scenario_used",
"methodology_url"
],
"type": "object"
},
"title": "Rank cities by composite quality score"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Batch lookup of safety-net values for 1 to 20 cities at once: parental leave weeks + how it is paid, universal healthcare flag, vacation days, public holidays, plus each city's safety_net dimension score (0-100) for relative strength. This is the only tool that accepts many cities in one call: use it to line several places up on family / leave / healthcare benefits. On parental leave, quote parental_leave_summary rather than composing your own line from parental_leave_paid_pct: Ireland, Australia, the UK, Czechia and part of Sweden pay a flat weekly cash sum instead of a share of salary, so their headline percentage is 0 or partial and reading it alone would wrongly call their leave unpaid; Germany pays a percentage up to a monthly cap (parental_leave_capped) and pays nothing at all above a household-income ceiling. Check parental_leave_basis (percentage / flat / capped / mixed / unpaid) before making any claim about pay. For one city's full profile (tax shape + costs + safety net together) call get_city_summary instead; for a two-city head-to-head that includes cost-of-living use compare_cities. Read-only, no side effects; returns a text summary plus structured JSON.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"cities": {
"description": "Array of city slugs (1-20). Use list_cities to discover valid slugs.",
"items": {
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
}
},
"required": [
"cities"
],
"type": "object"
},
"name": "get_safety_net",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"cities": {
"items": {
"additionalProperties": false,
"properties": {
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"parental_leave_basis": {
"enum": [
"percentage",
"flat",
"capped",
"mixed",
"unpaid",
"unknown",
"none"
],
"type": "string"
},
"parental_leave_capped": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"cap_amount": {
"type": [
"number",
"null"
]
},
"cap_period": {
"type": [
"string",
"null"
]
},
"currency": {
"type": [
"string",
"null"
]
},
"income_eligibility_ceiling": {
"type": [
"number",
"null"
]
},
"label": {
"type": [
"string",
"null"
]
},
"pct": {
"type": [
"number",
"null"
]
},
"weeks": {
"type": "number"
}
},
"required": [
"weeks",
"pct",
"cap_amount",
"cap_period",
"currency",
"income_eligibility_ceiling",
"label"
],
"type": "object"
},
{
"type": "null"
}
]
},
"parental_leave_effective_pct_at_benchmark": {
"type": [
"number",
"null"
]
},
"parental_leave_flat": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"currency": {
"type": [
"string",
"null"
]
},
"label": {
"type": [
"string",
"null"
]
},
"weekly_amount": {
"type": [
"number",
"null"
]
},
"weeks": {
"type": "number"
}
},
"required": [
"weeks",
"weekly_amount",
"currency",
"label"
],
"type": "object"
},
{
"type": "null"
}
]
},
"parental_leave_note": {
"type": [
"string",
"null"
]
},
"parental_leave_paid_pct": {
"type": [
"number",
"null"
]
},
"parental_leave_summary": {
"type": "string"
},
"parental_leave_weeks": {
"type": [
"number",
"null"
]
},
"public_holidays": {
"type": [
"number",
"null"
]
},
"safety_net_score": {
"type": "number"
},
"sick_leave_policy": {
"type": [
"string",
"null"
]
},
"slug": {
"type": "string"
},
"universal_healthcare": {
"type": "boolean"
},
"vacation_days_statutory": {
"type": [
"number",
"null"
]
}
},
"required": [
"slug",
"city",
"country",
"parental_leave_weeks",
"parental_leave_paid_pct",
"universal_healthcare",
"vacation_days_statutory",
"public_holidays",
"sick_leave_policy",
"safety_net_score"
],
"type": "object"
},
"type": "array"
},
"methodology_url": {
"type": "string"
},
"not_found": {
"items": {
"type": "string"
},
"type": "array"
},
"score_basis": {
"additionalProperties": true,
"properties": {},
"type": "object"
}
},
"required": [
"cities",
"methodology_url"
],
"type": "object"
},
"title": "Look up family safety net for several cities"
},
{
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true
},
"description": "Look up a city's inbound-worker tax regime, the special reduced-tax schemes for relocating workers that general cost-of-living tools do not surface. Returns regime=null when the country has no modeled regime, which is most cities. Modeled across 13 regimes in Belgium, Denmark, Germany, Greece, Ireland, Italy, Netherlands, Norway, Poland, Portugal, Spain, Sweden and the UK. Roughly half grant an actual reduction (a reduction_pct or a flat_rate) and the rest are note-only: the regime exists but grants a relocating employee nothing, so reduction_pct and flat_rate are null and the take-home is computed on ordinary tax. Each entry returns the mechanic, duration, income cap if any, and a note stating the salary floor where one exists and which eligibility conditions we do not test. Read-only, no side effects; returns a text summary plus structured JSON.",
"execution": {
"taskSupport": "forbidden"
},
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"city": {
"description": "City slug. Use list_cities to discover valid slugs. Most cities return regime=null because their country has no special inbound-worker tax regime.",
"maxLength": 64,
"minLength": 1,
"type": "string"
}
},
"required": [
"city"
],
"type": "object"
},
"name": "get_inbound_tax_regime",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"disclaimer": {
"type": "string"
},
"methodology_url": {
"type": "string"
},
"regime": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"duration_years": {
"type": [
"number",
"null"
]
},
"eligibility_summary": {
"type": [
"string",
"null"
]
},
"flat_rate": {
"type": [
"number",
"null"
]
},
"max_income": {
"type": [
"number",
"null"
]
},
"note": {
"type": [
"string",
"null"
]
},
"reduction_pct": {
"type": [
"number",
"null"
]
},
"type": {
"type": "string"
}
},
"required": [
"type",
"duration_years",
"reduction_pct",
"flat_rate",
"max_income",
"note",
"eligibility_summary"
],
"type": "object"
},
{
"type": "null"
}
]
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"city",
"country",
"regime",
"methodology_url"
],
"type": "object"
},
"title": "Look up inbound-worker tax regime for a city"
}
]
}
},
"url": "https://mcp.cityparity.com/mcp"
},
"latency_ms": 54.21,
"status": "ok"
},
"transport_compliance_probe": {
"details": {
"bad_protocol_error": null,
"bad_protocol_headers": {
"content-type": "application/json"
},
"bad_protocol_payload": {
"error": {
"code": -32000,
"message": "Bad Request: Unsupported protocol version: 1999-99-99 (supported versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07)"
},
"id": null,
"jsonrpc": "2.0"
},
"bad_protocol_status_code": 400,
"delete_error": null,
"delete_status_code": null,
"expired_session_error": null,
"expired_session_status_code": null,
"issues": [
"missing_session_id",
"missing_protocol_header"
],
"last_event_id_visible": false,
"protocol_header_present": false,
"requested_protocol_version": "2025-03-26",
"session_id_present": false,
"transport": "streamable-http"
},
"latency_ms": 28.64,
"status": "warning"
},
"utility_coverage_probe": {
"details": {
"completions": {
"advertised": false,
"live_probe": "not_executed",
"sample_target": null
},
"initialize_capability_keys": [
"tools"
],
"pagination": {
"metadata_signal": false,
"next_cursor_methods": [],
"supported": false
},
"tasks": {
"advertised": false,
"http_status": 200,
"probe_status": "missing"
}
},
"latency_ms": 14.44,
"status": "missing"
}
},
"failures": {
"oauth_authorization_server": {
"reason": "no_authorization_server"
},
"oauth_protected_resource": {
"error": "Client error '404 Not Found' for url 'https://mcp.cityparity.com/.well-known/oauth-protected-resource'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://mcp.cityparity.com/.well-known/oauth-protected-resource"
},
"openid_configuration": {
"reason": "no_authorization_server"
},
"server_card": {
"error": "Client error '404 Not Found' for url 'https://mcp.cityparity.com/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404",
"url": "https://mcp.cityparity.com/.well-known/mcp/server-card.json"
}
},
"remote_url": "https://mcp.cityparity.com/mcp",
"server_card_payload": null,
"server_identifier": "summerstateofmind/cityparity"
}
Capabilities
- OAuth:
- DCR/CIMD:
- Prompts:
- Homepage: https://glama.ai/mcp/servers/rz9eujy2ov
- Docs: none
- Support: https://github.com/summerstateofmind/cityparity
- Icon: none
- Remote endpoint: https://mcp.cityparity.com/mcp
- Server card: none
Transport compliance drilldown
Issues: missing_session_id, missing_protocol_header
Request association
Connector replay
Required-argument replay breaks
| Tool | Added required args | Removed required args |
|---|---|---|
| No required-argument replay breaks detected. | ||
Output-schema replay breaks
| Tool | Removed properties | Added properties |
|---|---|---|
| No output-schema replay breaks detected. | ||