MCP Chat
MCP server providing tools for LLMs (via Ollama) to get current time, calculate arithmetic, list files, and read project README, with a web chat UI.
README
MCP Chat
A React/Next.js web app that gives you a browser chat UI for an LLM running on the server (via Ollama), with the model able to call tools exposed by a Node MCP server.
Under the hood:
- The MCP server (src/server.js) reads its available tools from
tools.js. - It sends those tool definitions to a small local model via Ollama.
- It executes any tool calls the model requests.
- It feeds the tool results back to the model and returns the final reply.
- The web app never does any of this itself — it just calls the MCP server.
Architecture
flowchart LR
subgraph Clients[" "]
direction TB
Browser["Browser<br/>(page.js)"]
OtherClient["Other MCP clients<br/>(Claude Desktop, etc.)"]
end
Browser -- "fetch, same-origin" --> Route["Next.js<br/>/api/chat route<br/>(thin proxy)"]
OtherClient -- "MCP protocol" --> Server
Route -- "POST :3939/chat" --> Server
subgraph Server["MCP server process (src/server.js)"]
direction TB
MCP["POST /mcp<br/>(Streamable HTTP,<br/>real MCP protocol)"]
Chat["POST /chat<br/>(plain REST)"]
Tools["tools.js +<br/>ollamaLoop.js"]
Chat --> Tools
end
Tools -- "plain HTTP, not MCP<br/>POST :11434/api/chat" --> Ollama["Ollama (LLM)"]
The web app never talks to Ollama. The Next.js /api/chat route (web/src/app/api/chat/route.js) is a thin same-origin proxy — its only job is forwarding the browser's request to the MCP server's /chat endpoint and returning the response. It holds no Ollama client code and no tool-calling logic.
All of that lives inside src/server.js, the MCP server process, which exposes two HTTP endpoints:
POST /mcp— the actual MCP protocol (Streamable HTTP). Any real MCP client (Claude Desktop, another agent, etc.) can connect here to list/call the tools directly, with no Ollama involved at all.POST /chat— a plain REST endpoint, used only by our own web app. It reads tool definitions straight fromtools.js(in-process, no MCP round-trip needed since it's the same process), then runs the Ollama tool-calling loop (src/ollamaLoop.js): send messages + tool defs to Ollama's/api/chat, execute any requested tool calls locally, feed results back, repeat until Ollama replies with plain text.
So Ollama is purely an implementation detail of the MCP server — nothing outside src/server.js (and certainly not the browser or the Next.js route) ever calls it directly.
Available tools
Defined in src/tools.js, exposed to the model via the MCP server:
get_current_time— current server date/time.calculate— evaluates a basic arithmetic expression.list_directory— lists files/folders relative to the server's working directory.read_readme— reads this README (orweb/README.md), so the model can explain how the app works, its architecture, or how to run it.
Setup
npm install
cd web && npm install && cd ..
# install Ollama (macOS): https://ollama.com/download
brew install ollama
ollama serve & # starts the Ollama daemon on :11434
ollama pull llama3.2:3b # small model with tool-calling support
Other small tool-capable models that work too: qwen2.5:3b, mistral-nemo.
Override with OLLAMA_MODEL=qwen2.5:3b.
Run the MCP server
npm run server
Starts the MCP server on http://localhost:3939 — /mcp (Streamable HTTP MCP
protocol) and /chat (plain REST, runs the Ollama loop) both live here.
Run the web chat
cd web && npm run dev
Open http://localhost:3000. The page posts to its own /api/chat route,
which just proxies to the MCP server's /chat endpoint.
Requires npm run server (above) and Ollama to be running.
Files
- src/tools.js — tool definitions/handlers, registered on the MCP server.
- src/server.js — the MCP server:
/mcp(Streamable HTTP MCP protocol) and/chat(REST, runs the Ollama loop). - src/ollamaLoop.js — talks to Ollama's
/api/chat, runs the tool-calling loop. Used only bysrc/server.js. - web/src/app/page.js — top-level page, renders
ChatWindow. - web/src/app/api/chat/route.js — thin same-origin proxy to the MCP server's
/chat. - web/src/hooks/useChat.js — conversation state +
/api/chatcalls, used byChatWindow. - web/src/components/ChatWindow.jsx — assembles the chat UI from
MessageList+ChatInput. - web/src/components/MessageList.jsx / ChatMessage.jsx / WelcomeMessage.jsx — message history rendering.
- web/src/components/ChatInput.jsx — the textarea + Send/Cancel form.
Testing
npm test # MCP server + tools (Node's built-in test runner)
cd web && npm test # React components + useChat hook (Vitest + Testing Library)
- src/tools.test.js / src/server.test.js — tool handlers, and an integration test that spins up the MCP server on an ephemeral port and talks to it over real Streamable HTTP.
web/src/**/*.test.jsx/*.test.js— component and hook tests, colocated with the code they test.
Environment variables
OLLAMA_HOST(defaulthttp://localhost:11434) — used bysrc/server.js.OLLAMA_MODEL(defaultllama3.2:3b) — used bysrc/server.js.PORT(default3939) — MCP server port.MCP_SERVER_CHAT_URL(defaulthttp://localhost:3939/chat) — used byweb/'s/api/chatproxy route.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。