{"openapi":"3.1.0","info":{"title":"Flashcardmaker API","version":"0.1.0","description":"A fully local flashcard-set organizer built from your own term/definition pairs: a formatted flashcard-set generator, a spaced-repetition-lite (simplified Leitner box) study-session selector, and a self-quiz mode with fuzzy answer matching.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://flashcardmaker.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/flashcardmaker/docs"},"termsOfService":"https://connectorbay.com/flashcardmaker/terms"},"servers":[{"url":"https://flashcardmaker.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/flashcardmaker/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/create_flashcard_set":{"post":{"operationId":"create_flashcard_set","summary":"Validates and formats a flashcard set from caller-supplied term/definition pairs: assigns each card an","description":"Validates and formats a flashcard set from caller-supplied term/definition pairs: assigns each card an\n    id and starting spaced-repetition state, and returns both a structured list and a printable text study\n    sheet. Use for \"turn this list of terms and definitions into flashcards\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cards":{"description":"List of {\"term\": str, \"definition\": str} objects supplied by the caller.","items":{"additionalProperties":true,"type":"object"},"title":"Cards","type":"array"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional title for the set.","title":"Title"}},"required":["cards"],"title":"create_flashcard_setArguments","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/generate_study_session":{"post":{"operationId":"generate_study_session","summary":"Selects a subset of cards for a study session. 'spaced' mode uses a simplified Leitner box system —","description":"Selects a subset of cards for a study session. 'spaced' mode uses a simplified Leitner box system —\n    genuine priority logic where overdue and low-box (harder) cards are selected first. 'random' mode shuffles.\n    Use for \"give me today's study session from these cards\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cards":{"description":"List of cards, each {\"term\",\"definition\",\"box\" (1-5, default 1), \"last_seen_session\" (default 0)}.","items":{"additionalProperties":true,"type":"object"},"title":"Cards","type":"array"},"session_number":{"description":"The current session number (1, 2, 3, ...).","minimum":1,"title":"Session Number","type":"integer"},"session_size":{"default":10,"description":"Maximum number of cards to include in this session.","minimum":1,"title":"Session Size","type":"integer"},"mode":{"default":"spaced","description":"spaced | random","title":"Mode","type":"string"}},"required":["cards","session_number"],"title":"generate_study_sessionArguments","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/update_card_progress":{"post":{"operationId":"update_card_progress","summary":"Updates one card's spaced-repetition state after a review: 'hard' resets it to box 1 (due again next","description":"Updates one card's spaced-repetition state after a review: 'hard' resets it to box 1 (due again next\n    session), 'good' advances one box, 'easy' advances two boxes (due much later). Returns the new box and next\n    due session. Use for \"the user got this card wrong/right, update its schedule\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"box":{"description":"The card's current box (1-5).","maximum":5,"minimum":1,"title":"Box","type":"integer"},"result":{"description":"hard | good | easy","title":"Result","type":"string"},"session_number":{"description":"The session number this review happened in.","minimum":1,"title":"Session Number","type":"integer"}},"required":["box","result","session_number"],"title":"update_card_progressArguments","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/self_quiz_check":{"post":{"operationId":"self_quiz_check","summary":"Checks a typed self-quiz answer against the correct definition with reasonable fuzzy matching (text","description":"Checks a typed self-quiz answer against the correct definition with reasonable fuzzy matching (text\n    similarity plus keyword overlap), returning correct / close / incorrect rather than requiring an exact\n    match. Use for \"quiz me on this term and check my answer\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"term":{"description":"The flashcard term being quizzed.","minLength":1,"title":"Term","type":"string"},"user_answer":{"description":"The user's typed answer.","title":"User Answer","type":"string"},"correct_definition":{"description":"The card's correct definition.","minLength":1,"title":"Correct Definition","type":"string"}},"required":["term","user_answer","correct_definition"],"title":"self_quiz_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}}}}