Vocabit

io.github.JohnBilousovPublished by GitHub account JohnBilousovv0.1.3Updated Oct 24, 2026

Create flashcard sets in the Vocabit app and read back how the learner actually did.

Overview

AI-generated overview

Connects an assistant to the Vocabit flashcard app so it can publish study sets to a learner's phone and read back how they actually performed.

What you can do
  • Check connection status and which mode the server runs in
  • Create, list, read and update study sets, including a deep link that opens a set on the device
  • Read per-card results: weak, untouched and due cards, review counts and completion
  • Message the learner through Telegram that a set is waiting
  • Delete a set while keeping its study history
  • Expose a set as a listable resource and a prompt that walks the full study loop
When to use it
Useful when an assistant should turn a topic into flashcards a real learner works through in the Vocabit app, then adapt the next set from the app's spaced-repetition results instead of guessing. Demo mode lets you try the whole loop before having any backend or credentials.
Requirements
Runs locally via npx with Node.js. Live mode needs a Vocabit backend with the agent API enabled: VOCABIT_BASE_URL and VOCABIT_AGENT_KEY (sent as X-Agent-Key). Optional: VOCABIT_USER_ID, language defaults, VOCABIT_TELEGRAM_ID, VOCABIT_TIMEOUT_MS. With neither URL nor key it starts in demo mode; setting only one makes it refuse to start.
Before you install
The agent key is a secret that must match the backend's configured keys. The server writes to a real app: create, update and delete change the learner's sets, and delete is flagged destructive, though study history is kept. notify_learner messages a real person via Telegram and should be used sparingly. Demo results come from a simulated learner and are flagged as simulated, not real data.

Installation

In SourceWeft

  1. Open Vocabit in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

vocabit-mcp

[CI] [npm] [license]

An MCP server for Vocabit, a flashcard app. It lets an AI assistant write a study set into a real app on a real phone, and then read back how the learner actually did with it.

Most MCP servers read from an API. This one closes a loop:

mermaid
flowchart LR    A["Assistant<br/>teaches a topic"] --> B["create_study_set"]    B --> C["Set appears in the<br/>Vocabit app"]    C --> D["Learner works<br/>through it"]    D --> E["get_set_results"]    E -->|weak cards| A

The interesting tool is not create_study_set — anything can generate flashcards. It is get_set_results: which cards the learner marked hard, which they never reached, how many reviews each one took. The next set is built out of that, not out of a guess.

Try it in 30 seconds

No backend, no account, no API key:

bash
npx -y vocabit-mcp --demo

Demo mode runs the same server against an in-memory Vocabit with two seeded sets. Create a set, ask for results, and a deterministic stand-in learner will have worked through it — flagged in the response as simulated, so it is never mistaken for real data.

To poke at it with a UI:

bash
npx @modelcontextprotocol/inspector npx -y vocabit-mcp --demo

Install

Listed in the MCP Registry as io.github.JohnBilousov/vocabit-mcp, so clients that read the registry can find it on their own.

Claude Code
bash
claude mcp add vocabit -- npx -y vocabit-mcp
Claude Desktop / any MCP client
json
{  "mcpServers": {    "vocabit": {      "command": "npx",      "args": ["-y", "vocabit-mcp"],      "env": {        "VOCABIT_BASE_URL": "https://your-vocabit-backend.example.com",        "VOCABIT_AGENT_KEY": "your-agent-key"      }    }  }}

Drop the env block to run in demo mode.

Tools

ToolWhat it does
vocabit_healthCheck the connection and which mode the server is in.
create_study_setPublish a set to the learner's app. Returns a deep link that opens it on the device.
list_study_setsRecent sets, newest first, each with a progress summary.
get_study_setFull contents of one set, plus the topic and notes the assistant attached.
get_set_resultsThe feedback half. Per-card status, weakCards, untouchedCards, due cards.
update_study_setRetitle, retag, or append cards — typically the follow-up after reading results.
notify_learnerTelegram ping that a set is waiting.
delete_study_setRemove a set from the app. Study history is kept.

Also exposed: the vocabit://set/{setId} resource (a set as JSON, listable) and a study-session prompt that walks the whole loop.

Card states

Progress comes from the app's spaced-repetition engine, not from the assistant:

StatusMeaning
newNever reviewed.
strugglingLearner marked it hard.
learningMarked good.
masteredMarked easy.

A set reports completed: true once no card is left in new.

Live mode

Point the server at a Vocabit backend that has the agent API enabled:

bash
export VOCABIT_BASE_URL=https://your-vocabit-backend.example.comexport VOCABIT_AGENT_KEY=...   # must match one of AGENT_API_KEYS on the backendnpx -y vocabit-mcp
VariablePurpose
VOCABIT_BASE_URLBackend base URL.
VOCABIT_AGENT_KEYSent as X-Agent-Key.
VOCABIT_USER_IDFirebase UID of the learner. Optional; the backend has a default.
VOCABIT_TERM_LANGUAGE / VOCABIT_DEFINITION_LANGUAGEDefaults for new sets, e.g. de / en.
VOCABIT_TELEGRAM_IDRecipient for notify_learner.
VOCABIT_TIMEOUT_MSRequest timeout, default 20000.
VOCABIT_DEMO1 forces demo mode.

Set neither URL nor key and the server starts in demo mode. Set exactly one and it refuses to start — half a configuration is a mistake, not a hint.

Design notes

Demo mode is a first-class client, not a stub. HttpVocabitClient and DemoVocabitClient implement the same VocabitClient interface, so no tool has a branch for "are we pretending?". A reviewer can run the server before they have credentials, and the test suite exercises the real tool surface over a real MCP transport rather than mocking the SDK.

Errors are recoverable, not fatal. A failed call comes back as isError with the backend's own message plus a hint aimed at the model — 404 says "call list_study_sets to see which sets exist", 401 says "or run with VOCABIT_DEMO=1". Mutually exclusive arguments are rejected with an explanation instead of a guess.

Output schemas stay loose on the edges. Identifying fields are required; everything else is optional, so a backend that grows a field does not turn a working tool into a validation error.

Annotations are honest. delete_study_set is marked destructiveHint, the read tools readOnlyHint. notify_learner messages a real person, and its description says to use it sparingly.

Development

bash
git clone https://github.com/JohnBilousov/vocabit-mcp && cd vocabit-mcpnpm installnpm run buildnpm test          # tool surface + full loop, plus the HTTP client against a mocked fetchnpm run lint      # eslintnpm run format    # prettier --writenpm run inspect   # demo mode in the MCP Inspector

CI runs typecheck, lint, format:check, test, and build on every push and pull request.

src/  index.ts        CLI entry, stdio transport  config.ts       env → Config, demo-mode resolution  server.ts       tool / resource / prompt registration  schemas.ts      zod input and output shapes  format.ts       human-readable summaries next to structuredContent  client/    types.ts      wire types + VocabitClient contract    http.ts       live backend    mock.ts       in-memory backend for demo modetest/  server.test.ts       tool surface + full loop — over an in-memory MCP transport  client/    http.test.ts       query encoding, error-body parsing, timeouts — against a mocked fetch

Releasing

Publishing uses npm's trusted publishing (OIDC) — no NPM_TOKEN secret, nothing that can leak or expire. One-time setup on npmjs.com, under the package's Settings → Trusted publishing → GitHub Actions: organization JohnBilousov, this repository, workflow filename publish.yml.

To cut a release: bump the version in package.json, server.json, and VERSION in src/server.ts together (a test asserts they can't drift), commit, push, then publish a GitHub Release with a matching vX.Y.Z tag. That triggers .github/workflows/publish.yml, which runs the test suite and publishes to npm with provenance — the package page shows a verified link back to this exact commit and workflow run, not just a name on the registry.

Roadmap

  • Streamable HTTP transport alongside stdio
  • Multi-learner support without a backend default UID
  • Audio pronunciation cards

License

MIT © Ivan Bilousov

Source: README.md at commit b0bc8fd

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.3LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts