{"serverInfo":{"name":"Eloquent Surfaces","version":"1.0.0"},"transport":{"type":"http","endpoint":"https://surfaces.eloquentanalytics.com/api/mcp","method":"POST"},"capabilities":{"tools":{"available":true,"listChanges":false}},"tools":[{"name":"list_surfaces","description":"List registered surfaces across the platform, each with its access_patterns[] and applicable modifiers[]. Default exposure filter: live ∪ experiment patterns whose cohort matches the visitor fingerprint; reserve is hidden unless exposure:'all'.","inputSchema":{"type":"object","properties":{"service":{"type":"string","description":"Filter to one service."},"category":{"type":"string","enum":["standard","emerging","speculative"],"description":"Maturity filter."},"exposure":{"type":"string","enum":["reserve","experiment","live","deprecated","all"],"description":"Override the default deployment filter; 'all' returns reserve too."},"fingerprint":{"type":"string","description":"Visitor fingerprint; gates experiment access patterns into the result."}}},"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"get_surface","description":"Get one surface by pattern_id (with its access_patterns[]). Returns an array when the pattern_id exists for multiple services and no service is given.","inputSchema":{"type":"object","properties":{"pattern_id":{"type":"string","description":"The surface pattern_id."},"service":{"type":"string","description":"Disambiguate when the pattern_id is cross-service."}},"required":["pattern_id"]},"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"list_modifiers","description":"The cross-cutting modifiers, stated once on the page. Default exposure: live.","inputSchema":{"type":"object","properties":{"exposure":{"type":"string","enum":["reserve","experiment","live","deprecated","all"]}}},"annotations":{"readOnlyHint":true,"openWorldHint":false}},{"name":"register_surface","description":"Upsert one surface row keyed by (service, pattern_id). exposure defaults to reserve on first insert; re-register refreshes category/metadata only.","inputSchema":{"type":"object","properties":{"service":{"type":"string"},"pattern_id":{"type":"string"},"category":{"type":"string","enum":["standard","emerging","speculative"]},"exposure":{"type":"string","enum":["reserve","experiment","live","deprecated"]},"metadata":{"type":"object"},"registered_by":{"type":"string"}},"required":["service","pattern_id","category"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},{"name":"register_access_pattern","description":"Upsert one access_pattern row keyed by (service, pattern_id, access_key).","inputSchema":{"type":"object","properties":{"service":{"type":"string"},"pattern_id":{"type":"string"},"access_key":{"type":"string"},"detection_rule":{"type":"string"},"tag":{"type":"string"},"exposure":{"type":"string","enum":["reserve","experiment","live","deprecated"]},"experiment_id":{"type":"string"},"metadata":{"type":"object"}},"required":["service","pattern_id","access_key","detection_rule"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},{"name":"register_modifier","description":"Upsert one modifier row keyed by (service, modifier_id).","inputSchema":{"type":"object","properties":{"service":{"type":"string"},"modifier_id":{"type":"string"},"description":{"type":"string"},"applies_to":{"description":"\"all\" or an array of pattern_ids."},"detection_rule":{"type":"string"},"exposure":{"type":"string","enum":["reserve","experiment","live","deprecated"]},"metadata":{"type":"object"}},"required":["service","modifier_id","description","detection_rule"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},{"name":"set_exposure","description":"Move a surface (or one access pattern) along reserve → experiment → live → deprecated; stamps exposure_since. The promote/retire lever.","inputSchema":{"type":"object","properties":{"service":{"type":"string"},"pattern_id":{"type":"string"},"access_key":{"type":"string","description":"Transition the access pattern instead of the surface."},"exposure":{"type":"string","enum":["reserve","experiment","live","deprecated"]}},"required":["service","pattern_id","exposure"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},{"name":"update_surface","description":"Partial update of a surface's metadata/category. 404 if absent.","inputSchema":{"type":"object","properties":{"service":{"type":"string"},"pattern_id":{"type":"string"},"patch":{"type":"object","properties":{"category":{"type":"string","enum":["standard","emerging","speculative"]},"metadata":{"type":"object"}}}},"required":["service","pattern_id","patch"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},{"name":"upsert_experiment","description":"Upsert an experiment (idempotent on id). Concluding one (status:concluded + decision) authorizes the matching set_exposure promote/retire.","inputSchema":{"type":"object","properties":{"id":{"type":"string"},"service":{"type":"string"},"hypothesis":{"type":"string"},"cohort_rule":{"type":"object"},"variants":{"type":"array"},"status":{"type":"string","enum":["draft","running","concluded"]},"decision":{"type":"string","enum":["promote","retire"]}},"required":["id","hypothesis","cohort_rule"]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}}]}