Nunchi Bridge
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., "@Nunchi Bridgetell grandma I can't make it Sunday, something came up"
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.
Nunchi Bridge
Alexa+ relays messages between family members who don't share a language — in the register their relationship requires — and turns replies into plans both sides confirm.
Built for the Amazon Developer Hackathon 2026 (Alexa+ track) as a self-hosted MCP server (MCP spec 2025-11-25, Streamable HTTP) plus a simulated Alexa+ household web app. It does not run on a real Echo: Alexa+ add-on developer tools are in partner-only preview.
Demo video (1:37): https://youtu.be/MXJBo56_VDk — playback of a recorded live run; MCP calls, register checks and saves executed for real; AI text-to-speech narration.
What it does
Minjun (English) says: "Tell grandma I can't make it Sunday. Something came up."
The host agent looks up the household (
get_household): grandson → grandmother requires polite Korean (해요체).For comparison, a generic translation with no family context (a recorded Gemini output:
할머니한테 일요일에 못 간다고 전해줘. 일이 생겼어.) is refused bycheck_register: plain endings are curt from a grandchild to a grandmother.send_messagewould refuse it too, whatever the LLM wants. It is never sent.The agent's own relationship-aware draft passes the gate and is delivered. Minjun hears a back-translation to confirm the meaning.
Halmeoni replies in Korean:
그럼 토요일에 와. 갈비찜 해놓을게. 김치통 꼭 가져오고.Minjun gets it in English. The agent calls
propose_plan, and each item must quote its evidence verbatim from her message. Nothing is scheduled yet.Minjun presses Confirm, and
commit_planstores the Saturday visit and "bring the kimchi container" in shared state.
Related MCP server: OpenFateAI Assistant MCP
What the register gate is, and is not
It is: a deterministic safety gate, separate from the LLM, that catches selected high-risk Korean register violations before a message is sent. It checks three things:
plain (반말) sentence endings;
plain or confrontational "you" (너/너희/당신);
a few honorific-vocabulary slips. These are soft hints and do not block.
It is not: a complete judge of Korean politeness. Known limits (clause-level plain speech, subject honorifics, context-dependent 당신, family norms) are listed in docs/LINTER_RED_TEAM.md. Native-speaker review results are in docs/register_eval_set_reviewed.csv and summarized in the red-team doc; no general accuracy figure is claimed.
Family setting: the family's norm, not a textbook rule
By default, grandson → grandmother requires polite Korean. Some close families text their grandparents in casual speech (반말), and for them a refusal would be wrong. So a person can switch a pair to casual allowed (the toggle in the simulator header; POST /household/settings on the server).
This is not an MCP tool. An agent must never be able to relax the gate it is checked by.
Even in a casual family, plain/confrontational "you" (너, 당신) toward an elder is still refused.
Formal (하십시오체) or archaic endings are never blocked. They get a non-blocking warning with a suggested 해요체 replacement, e.g.
연락드리겠습니다→연락드릴게요,잡수셨사옵니까?→드셨어요?. The suggestion is only offered when a safe rule applies; irregular stems get no guess.
Implemented vs. simulated
Part | Status |
MCP server, 7 tools, Streamable HTTP, protocol 2025-11-25 | Implemented, tested |
Register gate (Korean) | Implemented, tested; scope as above |
Propose → human confirm → commit, with verbatim-evidence check | Implemented, tested |
Host agent loop (LLM chooses tools, real MCP calls) | Two live flows passed on Windows on 2026-09-30 with Gemini 3.5 Flash-Lite and prompt revision |
REPLAY MODE | Default script is converted from the new unchanged-demo live run ( |
Literal translation baseline | Comparison only, never sent. The first requested live flow produced a plain generic translation (REFUSED); the second produced a polite generic translation (PASS). Both relationship-aware agent drafts passed immediately. The default replay reproduces the first flow's recorded REFUSED baseline and labels its source; this is not an agent refusal-and-rewrite sequence |
Alexa+ device, voice | Simulated. Browser speech recognition/synthesis (Chrome) or typed input |
Family casual-speech setting | Implemented, tested (in replay the scripted agent draft stays polite; a live LLM is told the pair allows casual speech) |
Other languages | Not built. The policy table and gate interface are language-keyed |
Run it
pip install -r requirements.txt -c constraints-windows.txt # Python 3.11+; pins MCP SDK v1 (2.x removed FastMCP)
python -m nunchi.server # MCP server -> http://127.0.0.1:8000/mcp
python -m nunchi.sim_app # simulator -> http://127.0.0.1:8080
# optional live mode:
GEMINI_API_KEY=... python -m nunchi.sim_app
# optional fixed demo date (weekday resolution): NUNCHI_TODAY=2026-10-07 python -m nunchi.serverOn Windows PowerShell, see the Windows first-run guide. Do not enable billing for this demo; check current Gemini free-tier model availability before choosing GEMINI_MODEL.
Recorded live demo
In live mode the simulator records responses (tool arguments, translations, final replies) to live-recordings/latest-live-run.json, and archives a copy after confirmation. API keys and HTTP headers are not recorded. After one clean grandchild → grandmother → confirm flow:
python -m nunchi.recording --input live-recordings/successful-live-run.json --output nunchi/replay/demo_script.jsonThe converter rejects incomplete, failed or unconfirmed runs. Only the proposal's message ID and next-Saturday date become placeholders. Replay accepts only the recorded inputs (use Use demo line); start the server with NUNCHI_TODAY=2026-09-30 to reproduce the recorded dates exactly. See VALIDATION_V3_KO.md. LIVE_RUN_REPORT_KO.md is the earlier run's historical report.
Tests: python -m unittest discover -s tests (unit, MCP-over-HTTP integration, end-to-end demo scenario).
Any MCP client works against the server, for example MCP Inspector with transport "Streamable HTTP" and URL http://127.0.0.1:8000/mcp.
Tools
Tool | Purpose |
| Members, languages, today's date, required register per sender→reader pair |
| Per-sentence register status with English explanations |
| Deliver in the reader's language; refuses Korean text that fails the gate |
| Messages for a member |
| Events/to-dos from a message; evidence must be a verbatim quote; nothing scheduled |
| Store only items the named person confirmed; once per proposal |
| Read-only shared state |
The demo reset is an HTTP route (POST /demo/reset), deliberately not an MCP tool. The host also blocks any LLM attempt to call commit_plan.
Data and privacy
The household is fictional. State is in memory only.
License
MIT (see LICENSE).
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for OnceAsk, the AI-native current-address layer for people and agents.
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
An MCP memory server. One memory your agents share — across models, devices and apps.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA privacy-first MCP server that converts messy multi-turn conversations into structured, durable knowledge cards, targeting non-programming agent workflows.1MIT
- AlicenseAqualityDmaintenanceA local, open-source MCP server that provides deterministic organizational tools for structured decisions, guided reflection, action planning, and transparent digital report outlines without requiring an API key.642 npmMIT
- FlicenseNot gradedqualityDmaintenanceA Korean-centric MCP server that detects promise and schedule conflicts before sending messages, enabling users to review message drafts against stored commitments and conversation context.-
- AlicenseAqualityDmaintenanceAn MCP server that lets AI assistants propose sending Signal messages, but nothing is ever sent without explicit human approval.35 npmMIT