mcp-apps-lab
Fetches live RSS feeds from The Guardian Business and compiles them into a markdown news briefing.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-apps-labgive me a quiz about Python"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-apps-lab
One FastMCP app server (Python) โ a single MCP server that hosts four interactive Prefab apps (quiz, weather, news, English Duo) plus MCP resources and prompts. Each app tool returns a Prefab UI (buttons, cards, tabs, progress) instead of raw JSON; any MCP host renders them, and the LLM sees a text summary.
Apps
App | UI tool | Backend tool | What it demonstrates |
Quiz |
|
| Multi-turn state: the LLM generates questions, the user answers via buttons, each click grades through a backend tool, the final score is sent back to the conversation |
Weather |
|
| Live forecast from the Open-Meteo API: free-text location input geocodes ANY city name (no fixed table โ โbekasiโ works), shows current conditions with the city's local time (๐ 20:31 WIB), region/country, and a 5-day forecast; unknown names fall back to Jakarta, sample data offline (LIVE/SAMPEL badge); lookups go through the host's tools/call proxy (hashed tool names โ the proxy never sees the mapping) |
News Curator |
|
| Live RSS feeds (Bloomberg Markets, CNBC, The Guardian Business, BBC Business) fetched through the backend tool on tab click / refresh โ parsed with the stdlib, sample-data fallback when offline (LIVE/SAMPLE badge); compiles a markdown briefing and sends it back to the conversation |
English Duo |
|
| A Duolingo-style English learning app: CEFR-graded vocabulary (A1-B2), FSRS-6 spaced-repetition cards per word, and game mechanics โ XP + combo bonus, 5 hearts (mistakes cost one, daily refill), daily streak ๐ฅ, and a BronzeโDiamond level ladder. Due reviews + new words drive each lesson; answers are graded by the backend tool which reschedules the word's card and updates the profile in SQLite. |
Also exposed server-side: live resources (news://{source}/feed,
news://{source}/briefing, weather://{city}/current, duo://profile,
duo://due, duo://words/{level}, duo://guide/{level}, duo://levels)
and prompts (morning-briefing, daily-english).
Related MCP server: MCP + CrewAI Agentic Integration
Layout
src/mcp_apps_lab/
โโโ server.py # the ONE FastMCP server โ wires apps, tools, resources, prompts
โโโ apps/ # the FastMCPApp UIs (LLM-facing entry points)
โ โโโ quiz.py # take_quiz UI
โ โโโ weather.py # weather_app UI
โ โโโ news.py # news_curator UI
โ โโโ duo.py # duo_english UI (English Duo)
โโโ tools/ # backend tool functions the UIs call via the tool proxy
โ โโโ quiz.py # submit_answer
โ โโโ weather.py # get_weather
โ โโโ news.py # get_feed (live RSS fetch + offline fallback)
โ โโโ duo.py # grade_answer, get_profile, add_word
โโโ duo/ # the English Duo engine
โ โโโ store.py # SQLite persistence (~/.mcp-apps-lab/duo.db)
โ โโโ scheduler.py # FSRS-6 spaced-repetition wrapper
โ โโโ game.py # XP/combo, hearts, streak, level ladder
โ โโโ engine.py # lesson building + grading orchestration
โโโ resources/ # MCP resources (news://, weather://, duo://profile, duo://due)
โโโ prompts/ # MCP prompt templates (morning-briefing, daily-english)
โโโ data/ # feed definitions, offline fallback data, word bankSetup
uv sync # installs the package (editable) + fastmcp[apps] + dev toolsConfiguring which tools are enabled
config.json at the repo root decides which UI apps (tools) the server
advertises to the LLM. Disabled apps are not registered at all โ their
backend tools stay hidden too.
{
"tools": {
"take_quiz": false,
"weather_app": false,
"news_curator": true,
"duo_english": true
}
}Keys:
take_quiz,weather_app,news_curator,duo_english.Missing keys default to enabled; unknown keys are ignored.
Lookup order:
MCP_APPS_LAB_CONFIGenv var โ./config.jsonโ~/.mcp-apps-lab/config.json.The checked-in config currently runs with quiz and weather disabled (English Duo + News Curator active); flip the booleans to re-enable.
Running
Plain streamable-HTTP server
uv run python -m mcp_apps_lab # streamable HTTP at http://127.0.0.1:8090/mcp
# (MCP_APPS_LAB_PORT to override)Browser dev UI (fastmcp dev apps)
uv run fastmcp dev apps src/mcp_apps_lab/server.py --mcp-port 8090MCP server:
http://127.0.0.1:8090/mcp(auto-reload on save)Dev UI:
http://localhost:8080โ picktake_quiz,weather_app,news_curator, orduo_english, fill in arguments, and play the rendered app in a new tabThe left inspector panel shows the JSON-RPC traffic (including the hashed backend-tool calls the UIs make)
English Duo details
State lives in a SQLite database (~/.mcp-apps-lab/duo.db, override with
DUO_DB_PATH):
AI-generated content โ the coach generates fresh, CEFR-appropriate vocabulary itself (personalized to the user's level/interests) and passes it via the
wordsargument ofduo_english/duo_flashcards; sessions built this way show an โจ AI-GENERATED badge. Every generated word is saved to the bank with its own FSRS card, so it comes back in later review sessions. The built-in 120-word bank remains the fallback (and the source for due-review-only sessions).Duolingo brand UI โ Nunito typeface, Duolingo palette (green
#58CC02, blue#1CB0F6, yellow#FFC800, red#FF4B4B), rounded cards, 3D-press buttons, and green/red feedback banners โ distinct from the generic quiz UI.Spaced repetition โ one FSRS-6 card per word (
fsrspackage, the algorithm modern Anki uses). Correct โ Good, wrong โ Again; due reviews are served first in every lesson, new words fill the rest. An explicit level (e.g.duo_flashcards(level="b1")) is honored strictly: only that level's due reviews and new words are served, never other levels. The masthead shows the active level.Game mechanics โ 10 XP per correct answer + combo bonus (capped), โค๏ธ 5 hearts (a mistake costs one; refill daily), ๐ฅ streak (once per day per completed lesson), levels 1-10 with BronzeโDiamond leagues.
Exercise types โ five, cycling through each lesson so it never feels like one quiz:
mcโ โWhat does X mean?โ multiple choicefillโ pick the word that fits a sentence blanktypeโ TYPE the missing word (no choices at all)orderโ build the sentence by tapping scrambled word tiles (with a clear/undo button)flipโ flashcard: flip the card, then self-rate Again / Hard / Good / Easy โ mapped straight onto the FSRS ratings, so reviews get a real difficulty signal and XP (0/8/10/12) instead of just right/wrongFor a pure flashcards session (no quiz questions), the
duo_flashcardsUI serves flip cards only โ flip to reveal the definition, self-rate, and the FSRS schedule updates per card
Resources/prompts โ
duo://profileandduo://duegive the assistant live stats. The AI-generation reference resources:duo://guide/{level}(the per-level generation prompt โ learner profile, word scope, definition/example rules, output format),duo://words/{level}(existing words at a level, to match style and avoid duplicates), andduo://levels(overview + word counts). Thedaily-englishprompt wires everything into a daily routine.
Wiring into the ai-backend-lab agent
One server, one entry โ the agent sees all three UI tools plus the resources and prompt:
{
"mcp-apps-lab": {
"url": "http://127.0.0.1:8090/mcp",
"transport": "streamable_http"
}
}Then ask the agent something like "give me a quiz about Python", "show me the weather in Tokyo", "curate today's financial news", or "let's do my daily English practice" โ it calls the UI tool, and the agent's reply streams a structured tool event the frontend renders as the interactive app.
How it's structured
# server.py โ one server, apps filtered by config.json, plus resources & prompts
mcp = build_server() # providers = apps enabled in config.json
register_resources(mcp) # news://{source}/feed, weather://{city}/current, duo://profile, ...
register_prompts(mcp) # morning-briefing, daily-english
# apps/weather.py โ the UI app owns its backend tool
app = FastMCPApp("Weather")
app.add_tool(get_weather) # from mcp_apps_lab.tools โ hashed to this app
@app.ui() # LLM-facing entry point โ returns a PrefabApp
def weather_app(city: str) -> PrefabApp: ...@app.ui()tools are the only ones advertised to the LLM; their result is a Prefab UI the host renders (the model sees a text summary).Backend tools (
tools/) are plain functions registered withapp.add_tool(...): the renderer calls them over the MCP server under a hashed name (<sha256(app+tool)>_<tool>), so the UI can grade, look up, or compile without the LLM being in the loop โ and the tool proxy never sees the mapping.providers=[...]lets one server host several apps; resources and prompts are registered server-side and shared.
Adding to the lab
App: create
apps/<name>.py(aFastMCPAppwith an@app.ui()entry point), register its backend tool(s) fromtools/, and add the app toproviders=[...]inserver.py.Backend tool: add a plain function to
tools/<name>.py; register it withapp.add_tool(...)in the owning app.Resource / prompt: add a
register(mcp)function inresources/<name>.py/prompts/<name>.pyand call it from the correspondingregister_*inserver.py.Keep it lint-clean and tested:
uv run ruff check .anduv run pytest(smoke tests live intests/test_server.py).
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
MCP server for querying Forkast documentation
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceFastMCP is a comprehensive MCP server allowing secure and standardized data and functionality exposure to LLM applications, offering resources, tools, and prompt management for efficient LLM interactions.3MIT
- FlicenseBqualityDmaintenanceA FastMCP server providing real-time weather, news retrieval, and local note management tools for autonomous CrewAI agents. It enables context-aware multi-agent workflows with observability and high-speed inference integration.4-
- FlicenseNot gradedqualityDmaintenanceA FastMCP-based server providing tools for weather queries, random number generation, and real-time stock market data retrieval. It enables AI models to interact with external data and perform specific tasks through the Model Context Protocol.-
- FlicenseAqualityDmaintenanceA FastMCP server with web search, local notes CRUD, and a generative UI dashboard using Prefab.3-