Koskamo

Flashcards by Fulin Labs MCP

A remote MCP server enabling agents to create, study, and share personal vocabulary flashcards. It supports interactive study with examples and pronunciation, allows creation of decks from various languages, and provides shareable links for persistent access without requiring user authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Flashcards by Fulin Labs MCP logo, by Fulin LabsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-02Published by Fulin Labs
MCP endpoint (Streamable HTTP)
https://flashcard.fulinlabs.com/api/mcp
Vendor documentation

What its tools do

3 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

Can change data (1)

3 of 3 have a description · 3 of 3 declare behavior hints · 3 of 3 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Create vocabulary flashcards from conversations or lessons
  • Generate flashcards with pronunciation and translations
  • Save decks for shareable study links
  • Serve audio pronunciation for supported languages

Source and maintenance

Community listingRegistry 6.7.0
Maintenance checked

Protocol and capabilities

Server
flashcard-app 6.7.0
MCP protocol negotiated in check
2025-06-18
Tools
3 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {},
  "resources": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

When a user asks to learn, study, memorize, review, or practice a topic with this app, generate the complete flashcard deck and call create_flashcard_deck once. The tool returns the complete deck as structured data and text, and renders an interactive study UI in hosts that support MCP Apps. In other hosts, use the returned cards for recall practice. Never look for or call an add-card action. Treat a request such as "create a 50-card deck" as authorization to create and open the deck immediately using the topic, language pair, and source material already in the conversation. Do not ask for confirmation or make the user repeat available context. Infer and supply all tool fields yourself; never ask users to type language codes, JSON, or tool arguments. Ask one short question only if essential context is genuinely missing. Do not narrate preparation, repeat the full deck in prose, or explain internal validation. If a tool validation error can be corrected from the conversation, correct it and retry yourself. In hosts with the study UI, give at most one short sentence after success and let the interactive deck be the result. In text-only hosts, present useful recall practice from the returned cards. Call create_website_deck only if the user explicitly asks to save or share on the website; explain that anyone with the resulting link can access the deck. Never claim the deck was saved to the website unless website saving actually succeeded. For language learning, put the target language on the front and the user's known language on the back. Set the "language" field to the ISO 639-1 code of the front language (e.g. "zh" for Chinese, "ja" for Japanese, "vi" for Vietnamese) so audio and website saving use the right language automatically. Also set "backLanguage" to the ISO 639-1 code of the translations ("en" for English) so reversed cards use the correct voice. Infer this per deck from the user's request; do not assume Chinese merely because it may be their usual language. Provide exactly the number of fully completed cards the user requested, or 25 if they did not specify a count. Do not add a separate count argument, and never claim a count in the title while sending fewer cards. When extracting vocabulary from source text, select distinct useful words from that text and create a complete card for each one. Include an example sentence and translation for every language-learning card. For Japanese, use natural Japanese spelling on the front, a kana reading in pronunciation, a Japanese example, its kana reading in examplePronunciation, and its translation in exampleTranslation; use romaji only if requested. For Vietnamese, preserve every tone mark, include a natural Vietnamese example and translation, and set language to vi for the Vietnamese audio voice. Every Chinese card—not only the first few—must include pronunciation, example, and exampleParts. Split each Chinese example into useful words or short semantic phrases—not individual characters—and encode each part as a compact three-string array: [Chinese text, tone-marked pinyin, direct translation]. Cover the complete example exactly once, use no more than 12 parts, and attach punctuation to the preceding Chinese text. For example, 这些船只… begins with ["这些", "zhèxiē", "these"]. Always communicate both language and backLanguage for every language-learning deck, including English, French, German, Spanish, Italian, Korean, Japanese, Vietnamese, and Chinese. Use the user's requested language pair; if the translation language is unspecified, use the language of their request. If the target language is unclear, ask one brief question before generating. Do not guess from short or ambiguous words, the deck title, or app preferences. Audio currently supports only zh, de, es, it, fr, en, ko, ja, vi. If the user requests another language, explain the audio limitation rather than substituting a supported language or promising working audio. Every card must have a clear, concise front and back. Do not trigger this tool when: the user asks for a direct explanation without study intent, the user asks to delete or modify an existing deck, or the user requests a conversational quiz without creating a deck.

Tools

3 advertised

create_flashcard_deck — Create and study flashcards
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user asks to learn, study, memorize, review, practice, or create flashcards about any topic. Generate the complete deck in this call and open it in the interactive flashcard UI. Act immediately using the existing conversation and source material; infer language and backLanguage yourself. Never ask the user for language codes, tool arguments, or confirmation of an already requested deck. For a request for 50 cards, submit all 50 completed cards in one call. Keep the response brief and let the study UI show the deck. Examples include 'I want to learn about X', 'teach me X with flashcards', and 'Create an HSK3 vocabulary deck about restaurants'. Do not call a separate add-card tool. Do NOT use when the user asks for a direct explanation without study intent, asks to delete or modify an existing deck, or requests an in-conversation quiz without creating a deck.

create_flashcard_deck input schema
{
  "type": "object",
  "required": [
    "title",
    "cards"
  ],
  "properties": {
    "cards": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "front",
          "back"
        ],
        "properties": {
          "back": {
            "type": "string",
            "minLength": 1,
            "description": "Answer, definition, translation, or explanation. For language learning, always use the user's known language (e.g. English). This is the revealed answer when the card is flipped."
          },
          "front": {
            "type": "string",
            "minLength": 1,
            "description": "Prompt, question, term, word, or phrase. For language learning, always use the target language (the language being learned). For example: Chinese characters, Italian phrases, or Japanese words."
          },
          "example": {
            "type": "string",
            "description": "A concise example sentence or usage phrase in the target or subject language. Include when the user requests examples or when teaching a language."
          },
          "exampleParts": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "maxItems": 3,
              "minItems": 3,
              "description": "Exactly three strings in this order: [Chinese word or short semantic phrase, tone-marked pinyin for that segment, direct translation of that segment]. Attach adjacent punctuation to the Chinese text."
            },
            "maxItems": 12,
            "minItems": 1,
            "description": "For Chinese examples only: every part of the example in order, split into useful words or short semantic phrases. Encode each part compactly as [Chinese text, tone-marked pinyin, direct translation]. Cover the complete example exactly once in no more than 12 parts; attach punctuation to the preceding part."
          },
          "pronunciation": {
            "type": "string",
            "description": "Pinyin, romaji, IPA, or another reading guide for the front text. Required for language decks with non-Latin script (Chinese, Japanese, Korean, etc.) and when the user requests pronunciation."
          },
          "exampleTranslation": {
            "type": "string",
            "description": "Translation or plain-language explanation of the example."
          },
          "examplePronunciation": {
            "type": "string",
            "description": "Pronunciation or romanization of the example sentence."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 100,
      "minItems": 1,
      "description": "The complete generated deck. Include exactly the number of cards the user requested, with every required language-learning field completed; never submit a partial array or placeholders."
    },
    "title": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "A concise, descriptive title for the generated deck."
    },
    "language": {
      "enum": [
        "zh",
        "de",
        "es",
        "it",
        "fr",
        "en",
        "ko",
        "ja",
        "vi"
      ],
      "type": "string",
      "description": "ISO 639-1 code for the language spoken on the front side (e.g. 'zh' Chinese, 'ja' Japanese, 'vi' Vietnamese). Used for the correct audio voice and saved-deck language. Always infer and set it from the user's target language, never from their current app preference."
    },
    "backLanguage": {
      "enum": [
        "zh",
        "de",
        "es",
        "it",
        "fr",
        "en",
        "ko",
        "ja",
        "vi"
      ],
      "type": "string",
      "description": "Language of the translations on the back. Set from the user’s known language; never assume English. Always set for language-learning decks. Used for reverse-card audio."
    }
  },
  "additionalProperties": false
}
create_flashcard_deck output schema
{
  "type": "object",
  "required": [
    "title",
    "cardCount",
    "cards"
  ],
  "properties": {
    "cards": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "front",
          "back"
        ],
        "properties": {
          "back": {
            "type": "string",
            "minLength": 1,
            "description": "Answer, definition, translation, or explanation. For language learning, always use the user's known language (e.g. English). This is the revealed answer when the card is flipped."
          },
          "front": {
            "type": "string",
            "minLength": 1,
            "description": "Prompt, question, term, word, or phrase. For language learning, always use the target language (the language being learned). For example: Chinese characters, Italian phrases, or Japanese words."
          },
          "example": {
            "type": "string",
            "description": "A concise example sentence or usage phrase in the target or subject language. Include when the user requests examples or when teaching a language."
          },
          "exampleParts": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "text",
                "pronunciation",
                "translation"
              ],
              "properties": {
                "text": {
                  "type": "string"
                },
                "translation": {
                  "type": "string"
                },
                "pronunciation": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            },
            "maxItems": 12,
            "minItems": 1
          },
          "pronunciation": {
            "type": "string",
            "description": "Pinyin, romaji, IPA, or another reading guide for the front text. Required for language decks with non-Latin script (Chinese, Japanese, Korean, etc.) and when the user requests pronunciation."
          },
          "exampleTranslation": {
            "type": "string",
            "description": "Translation or plain-language explanation of the example."
          },
          "examplePronunciation": {
            "type": "string",
            "description": "Pronunciation or romanization of the example sentence."
          }
        },
        "additionalProperties": false
      }
    },
    "title": {
      "type": "string"
    },
    "language": {
      "enum": [
        "zh",
        "de",
        "es",
        "it",
        "fr",
        "en",
        "ko",
        "ja",
        "vi"
      ],
      "type": "string"
    },
    "cardCount": {
      "type": "integer"
    },
    "backLanguage": {
      "enum": [
        "zh",
        "de",
        "es",
        "it",
        "fr",
        "en",
        "ko",
        "ja",
        "vi"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
create_flashcard_deck annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
speak_text — Play text as speech
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the flashcard widget requests speech audio for the current card.

speak_text input schema
{
  "type": "object",
  "required": [
    "text",
    "language"
  ],
  "properties": {
    "text": {
      "type": "string",
      "maxLength": 5000,
      "minLength": 1,
      "description": "Text to speak."
    },
    "language": {
      "enum": [
        "zh",
        "de",
        "es",
        "it",
        "fr",
        "en",
        "ko",
        "ja",
        "vi"
      ],
      "type": "string",
      "description": "Language of the text being spoken. Always specify the current side’s language; never default to the other side or app preferences."
    }
  },
  "additionalProperties": false
}
speak_text output schema
{
  "type": "object",
  "required": [
    "contentType"
  ],
  "properties": {
    "contentType": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
speak_text annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_website_deck — Save a flashcard deck on Fulin Labs
Advertised by the server during the last successful anonymous check.
Open-world

Use this when the user explicitly asks to save or share a deck on the website, or chooses Learn on website in the study widget. It sends the supplied deck to Fulin Labs and creates a persistent shareable deck link. Anyone with the link can read the deck. Do not call merely to preview or study a deck. Repeating the call may create another deck.

create_website_deck input schema
{
  "type": "object",
  "required": [
    "title",
    "cards"
  ],
  "properties": {
    "cards": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "front",
          "back"
        ],
        "properties": {
          "back": {
            "type": "string",
            "minLength": 1,
            "description": "Answer, definition, translation, or explanation. For language learning, always use the user's known language (e.g. English). This is the revealed answer when the card is flipped."
          },
          "front": {
            "type": "string",
            "minLength": 1,
            "description": "Prompt, question, term, word, or phrase. For language learning, always use the target language (the language being learned). For example: Chinese characters, Italian phrases, or Japanese words."
          },
          "example": {
            "type": "string",
            "description": "A concise example sentence or usage phrase in the target or subject language. Include when the user requests examples or when teaching a language."
          },
          "exampleParts": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1
              },
              "maxItems": 3,
              "minItems": 3,
              "description": "Exactly three strings in this order: [Chinese word or short semantic phrase, tone-marked pinyin for that segment, direct translation of that segment]. Attach adjacent punctuation to the Chinese text."
            },
            "maxItems": 12,
            "minItems": 1,
            "description": "For Chinese examples only: every part of the example in order, split into useful words or short semantic phrases. Encode each part compactly as [Chinese text, tone-marked pinyin, direct translation]. Cover the complete example exactly once in no more than 12 parts; attach punctuation to the preceding part."
          },
          "pronunciation": {
            "type": "string",
            "description": "Pinyin, romaji, IPA, or another reading guide for the front text. Required for language decks with non-Latin script (Chinese, Japanese, Korean, etc.) and when the user requests pronunciation."
          },
          "exampleTranslation": {
            "type": "string",
            "description": "Translation or plain-language explanation of the example."
          },
          "examplePronunciation": {
            "type": "string",
            "description": "Pronunciation or romanization of the example sentence."
          }
        },
        "additionalProperties": false
      },
      "maxItems": 100,
      "minItems": 1,
      "description": "The cards the user explicitly chose to save on Fulin Labs."
    },
    "title": {
      "type": "string",
      "maxLength": 120,
      "minLength": 1,
      "description": "The title of the deck the user chose to save."
    },
    "language": {
      "enum": [
        "zh",
        "de",
        "es",
        "it",
        "fr",
        "en",
        "ko",
        "ja",
        "vi"
      ],
      "type": "string",
      "description": "Optional language code for the deck's front side."
    }
  },
  "additionalProperties": false
}
create_website_deck output schema
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    }
  },
  "additionalProperties": false
}
create_website_deck annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

interactive-flashcard-study-deck — Interactive flashcard study deck

Advertised by the server during the last successful anonymous check.

Flip and study vocabulary flashcards in clients that support MCP Apps.

interactive-flashcard-study-deck URI
ui://widget/flashcard-study-v19.html

MIME type: text/html;profile=mcp-app

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-02: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
3481 ms
95th percentile latency
3481 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 3481 ms · metadata changed · 3 tool(s), 1 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http flashcards-by-fulin-labs-mcp https://flashcard.fulinlabs.com/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add flashcards-by-fulin-labs-mcp --url https://flashcard.fulinlabs.com/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable flashcards-by-fulin-labs-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "flashcards-by-fulin-labs-mcp": {
      "url": "https://flashcard.fulinlabs.com/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "flashcards-by-fulin-labs-mcp": {
      "type": "streamableHttp",
      "url": "https://flashcard.fulinlabs.com/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start flashcards-by-fulin-labs-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "flashcards-by-fulin-labs-mcp": {
      "type": "http",
      "url": "https://flashcard.fulinlabs.com/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http flashcards-by-fulin-labs-mcp https://flashcard.fulinlabs.com/api/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "flashcards-by-fulin-labs-mcp": {
      "url": "https://flashcard.fulinlabs.com/api/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "flashcards-by-fulin-labs-mcp": {
      "serverUrl": "https://flashcard.fulinlabs.com/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Flashcards by Fulin Labs MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.