{"openapi":"3.1.0","info":{"title":"Decksense API","version":"0.1.0","description":"Computed WCAG contrast-ratio checking, text-density/one-idea-per-slide heuristics, pacing/slide-count math, plus hand-curated data-visualization, font-pairing and design-principle reference.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://decksense.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/decksense/docs"},"termsOfService":"https://connectorbay.com/decksense/terms"},"servers":[{"url":"https://decksense.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/decksense/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/contrast_ratio_check":{"post":{"operationId":"contrast_ratio_check","summary":"Compute the exact WCAG 2.x contrast ratio between two colors and whether it passes AA/AAA for normal/large","description":"Compute the exact WCAG 2.x contrast ratio between two colors and whether it passes AA/AAA for normal/large\n    text. Use for \"is this text readable on a dark background\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"hex_color_1":{"description":"A hex color, e.g. #1D4ED8.","title":"Hex Color 1","type":"string"},"hex_color_2":{"description":"A hex color to check contrast against.","title":"Hex Color 2","type":"string"}},"required":["hex_color_1","hex_color_2"],"title":"contrast_ratio_checkArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/color_palette_check":{"post":{"operationId":"color_palette_check","summary":"Compute contrast ratios across every pair in a color palette, flagging near-indistinguishable pairs and an","description":"Compute contrast ratios across every pair in a color palette, flagging near-indistinguishable pairs and an\n    oversized palette. Use for \"check my slide color palette\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"hex_colors":{"description":"2-10 hex colors.","items":{"type":"string"},"maxItems":10,"minItems":2,"title":"Hex Colors","type":"array"}},"required":["hex_colors"],"title":"color_palette_checkArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/text_density_check":{"post":{"operationId":"text_density_check","summary":"Compute word/bullet counts for a slide's text against the \"6x6\" rule of thumb (max ~6 bullets, ~6 words","description":"Compute word/bullet counts for a slide's text against the \"6x6\" rule of thumb (max ~6 bullets, ~6 words\n    each). Use for \"is this slide too dense\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"slide_text":{"description":"The slide's text, one line per bullet.","minLength":1,"title":"Slide Text","type":"string"},"word_limit":{"default":40,"maximum":200,"minimum":1,"title":"Word Limit","type":"integer"}},"required":["slide_text"],"title":"text_density_checkArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/one_idea_check":{"post":{"operationId":"one_idea_check","summary":"A structural heuristic (line/word counts) on whether a slide likely covers one idea or several. Use for","description":"A structural heuristic (line/word counts) on whether a slide likely covers one idea or several. Use for\n    \"does this slide try to do too much\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"slide_text":{"description":"The slide's text, one line per bullet.","minLength":1,"title":"Slide Text","type":"string"}},"required":["slide_text"],"title":"one_idea_checkArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/slide_design_principles":{"post":{"operationId":"slide_design_principles","summary":"Slide design principles — text density, contrast, one-idea-per-slide, data visualization, hierarchy,","description":"Slide design principles — text density, contrast, one-idea-per-slide, data visualization, hierarchy,\n    whitespace, consistency. Use for \"what are the rules of good slide design\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"text_density | contrast | one_idea_per_slide | data_visualization | hierarchy | whitespace | consistency; omit for all.","title":"Topic"}},"title":"slide_design_principlesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/data_viz_recommendation":{"post":{"operationId":"data_viz_recommendation","summary":"Chart-type recommendation and rationale for a data shape, with notes if category/series counts push toward","description":"Chart-type recommendation and rationale for a data shape, with notes if category/series counts push toward\n    a different treatment. Use for \"what chart should I use to compare 5 regions' sales\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"data_type":{"description":"categorical_comparison | time_series | part_to_whole | distribution | correlation | ranking | geographic","title":"Data Type","type":"string"},"num_categories":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"How many categories/parts, if relevant.","title":"Num Categories"},"num_series":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"How many data series on the chart.","title":"Num Series"},"goal":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"What you want the chart to communicate.","title":"Goal"}},"required":["data_type"],"title":"data_viz_recommendationArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/pacing_guidance":{"post":{"operationId":"pacing_guidance","summary":"Compute minutes-per-slide and a plain-language pacing verdict for a talk length and slide count. Use for","description":"Compute minutes-per-slide and a plain-language pacing verdict for a talk length and slide count. Use for\n    \"is 40 slides too many for a 20-minute talk\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"total_minutes":{"maximum":600,"minimum":1,"title":"Total Minutes","type":"integer"},"slide_count":{"maximum":500,"minimum":1,"title":"Slide Count","type":"integer"}},"required":["total_minutes","slide_count"],"title":"pacing_guidanceArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/slide_count_recommendation":{"post":{"operationId":"slide_count_recommendation","summary":"Compute a recommended slide count for a talk length and pace. Use for \"how many slides for a 20-minute","description":"Compute a recommended slide count for a talk length and pace. Use for \"how many slides for a 20-minute\n    talk\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"total_minutes":{"maximum":600,"minimum":1,"title":"Total Minutes","type":"integer"},"pace":{"default":"normal","description":"relaxed | normal | fast","title":"Pace","type":"string"}},"required":["total_minutes"],"title":"slide_count_recommendationArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/font_pairing_suggestion":{"post":{"operationId":"font_pairing_suggestion","summary":"Structural (not brand-specific) headline/body font-pairing guidance for a style. Use for \"what fonts pair","description":"Structural (not brand-specific) headline/body font-pairing guidance for a style. Use for \"what fonts pair\n    well for a modern deck\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"style":{"description":"modern | classic | minimal | bold | friendly","title":"Style","type":"string"}},"required":["style"],"title":"font_pairing_suggestionArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/presentation_checklist":{"post":{"operationId":"presentation_checklist","summary":"A pre-presentation checklist, with extra items when context mentions a remote/virtual talk. Use for \"what","description":"A pre-presentation checklist, with extra items when context mentions a remote/virtual talk. Use for \"what\n    should I check before I present\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"context":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"e.g. 'remote' or 'in-person' for tailored items.","title":"Context"}},"title":"presentation_checklistArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}