Literature Clock

io.github.markusvankempen由 GitHub 帳號 markusvankempen 發布v1.6.2更新於 Oct 24, 2026

A line for the current minute, from literature, copyright-free books, or an original voice.

已驗證STDIO僅桌面效率與工作流知識與記憶

概覽

AI 產生的概覽

讓助理取得目前分鐘對應的文學句子,來源包括文學作品集、隨附的無版權書籍或原創角色聲音。

可以做什麼
這台伺服器像文學時鐘一樣,用一句話說出目前分鐘。工具包括 get_quote(依指定時間或 now 取句)、list_sources(列出可用來源與聲音 id)、count_lines(統計某一分鐘有多少本機句子)以及 describe_server(查看版本與驗證資訊)。管理類工具涵蓋設定、使用者、API 金鑰、日誌與定時推送。資源與提示提供取句與現成提示詞。
適用情境
適合在聊天用戶端、儀表板或網頁中顯示時鐘或氛圍引文,也適合把某個具體分鐘轉成文學句子。它偏讀取、規模小,較適合個人使用而非資料密集型流程。
執行需求
以 npm 套件形式在本機透過 stdio 執行,通常用 npx 啟動;HTTP 模式可提供瀏覽器時鐘與 MCP 端點。需要 Node.js,不需帳號。選用環境變數包括 ADMIN_USER、ADMIN_PASSWORD、AUTH_MODE、MCP_API_KEY 與 RATE_LIMIT。literature 來源可能透過網路存取公開 JSON 來源。
安裝前請注意
驗證預設為關閉,取句工具不需憑證;管理工具與 generate_traffic 仍需憑證。ADMIN_PASSWORD 在筆電上預設為 demo,在公開綁定位址上沒有預設值,對外開放前應先設定。MCP_API_KEY 密鑰只顯示一次。管理工具可變更設定、使用者、金鑰與日誌,export_settings 會包含已儲存使用者的密碼雜湊。伺服器時鐘採用主機的時區。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Literature Clock,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[Literature Clock, a cream and ink clock mark]

Literature Clock MCP

A line for the current minute, from literature, copyright-free books, or an original voice.

[version 1.6.5] [Apache-2.0] [Node.js 20 or newer] [MCP stdio and HTTP] [Literature collection CC BY-NC-SA 2.5]

[npm literature-clock-mcp] [GitHub literature-clock-mcp] [Cursor] [VS Code] [Claude Desktop]

mcp model-context-protocol mcp-server literature-clock ink-clock quotes books voices stdio streamable-http cursor vscode claude

Client pages

clients/ is a set of HTML pages for Cursor, VS Code, Claude Desktop, a browser that calls get_quote, a page that subscribes to the quote push on GET /events, and a page that reads and changes settings. Open clients/index.html, or serve the folder on localhost so those pages can reach the server.

Add the server

Cursor — ~/.cursor/mcp.json

json
{  "mcpServers": {    "literature-clock-mcp": {      "command": "npx",      "args": ["-y", "literature-clock-mcp"]    }  }}

VS Code — user or workspace mcp.json

json
{  "servers": {    "literature-clock-mcp": {      "type": "stdio",      "command": "npx",      "args": ["-y", "literature-clock-mcp"]    }  }}

Claude Desktop — ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows

json
{  "mcpServers": {    "literature-clock-mcp": {      "command": "npx",      "args": ["-y", "literature-clock-mcp"]    }  }}

This repository is the project home. It does not contain the server source. Install the published package with the npx blocks above.

Add a hosted server

The same configs work for Render, IBM Code Engine, or any host that serves this app over HTTPS. The MCP URL is the site plus /mcp. The live Render server is https://literature-clock-mcp.onrender.com/mcp. A Code Engine app looks like https://<app>.<region>.codeengine.appdomain.cloud/mcp.

The host must run MCP_MODE=http HOST=0.0.0.0 npx -y [email protected] and leave PORT for the platform. Deploy steps for Render are under Render.

When auth mode is write or all, add a header Authorization: Bearer <key>. Auth is off on a fresh server, so the blocks below need no key.

Cursor — this project: .cursor/mcp.json. Every project: ~/.cursor/mcp.json.

json
{  "mcpServers": {    "literature-clock-mcp": {      "url": "https://literature-clock-mcp.onrender.com/mcp"    }  }}

Save the file. Open Cursor Settings → MCP and turn literature-clock-mcp on. A green dot means the handshake worked. In Agent chat, ask: ask literature-clock-mcp for the current quote.

VS Code — workspace .vscode/mcp.json, or Command Palette → MCP: Open User Configuration.

json
{  "servers": {    "literature-clock-mcp": {      "type": "http",      "url": "https://literature-clock-mcp.onrender.com/mcp"    }  }}

Command Palette → MCP: List Servers → start literature-clock-mcp. In Copilot Chat, confirm the server is selected in the tools list, then ask for the current quote.

Claude Desktop — the desktop file only starts a local process. mcp-remote opens the hosted URL. Config path: ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows. Quit Claude and open it again after you save.

json
{  "mcpServers": {    "literature-clock-mcp": {      "command": "npx",      "args": ["-y", "mcp-remote", "https://literature-clock-mcp.onrender.com/mcp"]    }  }}

The first call after a free Render instance has been idle can take a moment while the process wakes. The clock on the server is that machine’s clock. On Render that is UTC, so “now” is four hours ahead of Toronto.

An MCP server that tells the time the way a literature clock does: one sentence that names that exact minute.

The default source is Literature, Johannes Enevoldsen's literature-clock collection (CC BY-NC-SA 2.5). Books are copyright-free lines bundled with the server. The other sources are original voices written for this clock, not quotations from films or living authors.

No account and no analytics. Books and voices stay on the machine. Literature tries those bundled exact-minute lines first, then the public collection, and falls back to copyright-free books if the library does not answer.

npmliterature-clock-mcp
MCP nameio.github.markusvankempen/literature-clock-mcp
NameLiterature Clock · package literature-clock-mcp
Version1.6.5 on npm. This git tree does not contain src/.
Transportsstdio, Streamable HTTP (/mcp), legacy SSE (/sse). Each can be turned off in Settings. One stays on.
Sourceliterature-clock-mcp · Chrome twin chrome-ext-ink-clock

Screenshots

The HTTP clock, with Literature selected for 11:11.

[Literature Clock page: a line for 11:11, source set to Literature]

An original voice, not a book quotation.

[Pirate voice at 09:05]

Settings (laptop sign-in demo / demo). Default source, time zone, 12-hour or 24-hour clock, users and passwords, auth, and rate limit.

[Settings: default source Literature, auth off, rate limit 60]

[Settings: tool gates and API keys]

Sign-in before Settings on a fresh session.

[Settings sign-in]

Features

FeatureWhere
Clock page/ — Show, Another line, Random, Read aloud. ?source=literature&time=09:05
Literature, books, mix, surprise, voicesDefault source is literature. list_sources
Clock, settings, keys, users, logEach Settings form is a tool: set_clock, set_auth_mode, set_audit, set_rate_limit, set_protocols, set_ui_auth, set_tool_gate, set_tool_lock, set_push. Backup is export_settings then import_settings. The log is set_audit, then generate_traffic, then export_log. Those need the admin scope even when auth mode is off.
JSON Schemalist_schemas then get_schema, or tools/list on the Tools page
Run a toolTools page. Copy JSON, or open the result in a new tab
Resourcessources://list, quote://{source}/{hhmm}
Promptsdiagnose-server, quote-for-now, another-line, mix-the-minute, voice-at-nine, books-for-a-minute, read-settings
Protocolsstdio, Streamable HTTP (/mcp), legacy SSE (/sse). Settings → Protocols. One stays on
Hide pages until sign-inSettings → Protocols. JSON and MCP stay available
Health, smoke, traffic/health, /test. Traffic needs a sign-in or an API key. It fills the log with reads, a bad time, an unknown schema, and a rejected key
SettingsClock, security, protocols, push, tool gates, API keys, users, backup
Quote pushEvery 5, 10, 15, 30, or 60 minutes, or one line immediately with push_quote
Event streamGET /events. The Events client subscribes and can push one line
LogCounters, errors, call trace, audit trail. Export names the caller (user, API key, or anonymous)
Authoff, write, or all. Keys and users on Settings. describe_server stays open
Client pagesclients/ for Cursor, VS Code, Claude Desktop, a browser, the event stream, and settings

Quote sources

SourceWhat you get
literature (default)Johannes Enevoldsen's collection. Exact-minute bundled copyright-free lines first. If that minute has none, the public JSON feed (safer passages). If the feed does not answer, a copyright-free line, marked as a library fallback.
booksBundled copyright-free corpus only. An empty minute uses the nearest earlier readable line and says so.
mixExact minute from books and every voice.
surpriseOne random source, then a line from it.
voicesOriginal lines: Yoda, Teacher, Pirate, Aussie, Canadian, Cat, Chef, Comedian, Cowboy, Detective, English, French, Hitchhiker, Hockey, Librarian, New Yorker, Pilot, Robot, Scottish, Soccer, Sports, Star Trek, Star Wars, Vampire.

list_sources returns the live catalog, including each voice id.

Tools

ToolScopeWhen to use
describe_serverreadFirst call, and again after any denial. Version, auth mode, tools, and how time and source work.
list_sourcesreadliterature, books, mix, surprise, and each voice id.
get_quotereadOne or more lines for HH:MM or now. Omit source to use the saved default.
count_linesreadHow many local lines each source has for one minute
get_settingsreadClock defaults, auth, rate limit, protocols, tool gates, and the quote schedule, including clientPush.
update_settingswriteThe same values as Settings, including clientPush, one tool gate, and one tool lock.
list_schemasreadNames for the line, source, settings, and tool schemas.
get_schemareadJSON Schema for one of those names. A tool name includes inputSchema and outputSchema.
push_quotewriteSend the current quote to open GET /events clients now. Off until clientPush is on. HTTP only.
list_usersadminSettings → Users. Names and scopes. Passwords are not returned.
create_useradminSettings → Users → Save user.
delete_useradminSettings → Users → Remove. The built-in admin stays.
list_api_keysadminSettings → API keys. The secret is not returned.
issue_api_keyadminSettings → API keys → Issue key. The secret is returned once.
revoke_api_keyadminSettings → API keys → Revoke. Pass the id from list_api_keys.
export_settingsadminSettings → Backup → Export. Includes saved-user password hashes. Omits API keys and the MQTT password.
import_settingsadminSettings → Backup → Import. Pass the export object.
export_logadminLog → Export log and trace.
push_quote_nowadminSettings → Push → Push a quote now. Uses the saved destinations.
generate_trafficreadTest → Generate traffic. Needs any credential, even when auth mode is off. Then call export_log.
set_clockadminSettings → Clock. Then get_quote with no source.
set_auth_modeadminSettings → Security → Apply mode. Then describe_server.
set_auditadminSettings → Security → Call trace. Then generate_traffic and export_log.
set_rate_limitadminSettings → Security → Rate limit. Then describe_server.
set_protocolsadminSettings → Protocols. Send all three; at least one stays on. Then describe_server.
set_ui_authadminHide HTML pages until sign-in. Then get_settings.
set_tool_gateadminEnable or disable one tool. describe_server stays available. Then describe_server.
set_tool_lockadminLock a tool so it needs a credential even when auth mode is off. Then describe_server.
set_pushadminSettings → Push → Save schedule. Then push_quote_now, or push_quote when client push is on.

get_schema for a tool includes inputSchema, outputSchema, and the next call. Follow that next field once. describe_server returns server.version and server.description. The same version is in the page header, on Health, in get_settings, and in the server schema.

get_quote is read-only. Pass avoid with the previous line text to get a different line for the same minute. count is 1–8. Failures set isError: true. An empty lines array means that minute has no row — try literature, books, or mix. Do not invent a quotation.

Example:

json
{ "time": "09:05", "source": "literature" }

Quote push

The schedule is off until an interval and a destination are saved. The HTTP process sends the current quote from the saved source and time zone. A matching minute is :00, :05, :10, and so on. stdio does not run the schedule. A chat client does not print a push. Call get_quote for a line in the reply.

DestinationWhat receives the line
Event streamGET /events. SSE event name quote. The first frame on connect is event: ready.
Legacy SSEOpen GET /sse sessions. Notification notifications/literature-clock/quote.
Streamable HTTPOpen POST /mcp sessions. The same notification.
MQTTThe saved broker and topic. The password is stored and is not returned by get_settings.

clientPush lets a client call push_quote without waiting for the minute. That call always includes the event stream, plus any other saved destination. Turn it on under Settings → Push, or with update_settings and "clientPush": true. The Events page has Push a quote now, which calls push_quote. Subscribe first, then press it.

Settings → Push → Push a quote now uses the saved destinations only. Save the schedule before that button. It does not turn clientPush on.

The clock on a host is that machine’s time zone setting. timeZone device is the process zone. On Render that is UTC.

Resources and prompts

KindName
Resourcesources://list
Resourcequote://{source}/{hhmm} — quote://literature/09-05, quote://pirate/14-30, or quote://books/now
Promptdiagnose-server
Promptquote-for-now
Promptanother-line
Promptmix-the-minute
Promptvoice-at-nine
Promptbooks-for-a-minute
Promptread-settings

Run

Published package:

bash
npx literature-clock-mcp                 # stdioMCP_MODE=http npx literature-clock-mcp   # http://127.0.0.1:8080/health
URLWhat it shows
/Clock. ?source=literature&time=09:05. Another line skips the line on screen. Random picks a different source. Read speaks the line.
/adminSettings. Laptop sign-in demo / demo unless ADMIN_USER and ADMIN_PASSWORD are set. On a public bind the laptop password is off until ADMIN_PASSWORD is set. Backup exports and imports settings.
/healthProcess is up. cwd only on localhost.
/testRead-only smoke, plus Generate traffic after a sign-in or Authorization: Bearer key (reads, a bad time, an unknown schema, a rejected key).
/toolsTool list. Run list_schemas and get_schema, or load tools/list.
/helpFeature list, author, pages, and tools.
/sseLegacy SSE
/mcpStreamable HTTP
/eventsPlain SSE. Event ready on connect, then quote when a push runs
/logCall trace, after sign-in, when audit is on

The same settings are get_settings / update_settings, and GET or POST /api/settings.

The browser UI is HTTP only. stdio does not open a page. MCP_MODE=http npx [email protected] serves the clock. The local desk port in development is http://127.0.0.1:8788/.

Render

render.yaml starts the published npm package. This repository does not contain the server source. Leave PORT unset so Render can set it. Bind 0.0.0.0.

Start command

bash
MCP_MODE=http HOST=0.0.0.0 npx -y [email protected]
KeyValue
MCP_MODEhttp
HOST0.0.0.0
ADMIN_PASSWORDa password you choose. Required on this public address

Health check path: /health.

The clock is https://<your-service>.onrender.com/. The MCP URL is that host plus /mcp. Settings sign-in uses ADMIN_USER (default demo) and ADMIN_PASSWORD. The laptop password demo is off on that public address. IDE setup for that URL, and for Code Engine, is under Add a hosted server.

Example

In Cursor, with literature-clock-mcp.onrender.com connected:

ask literature-clock-mcp for the current quote

The Literature Clock on Render answered for 16:01, the clock on that server. That is 12:01 PM in Toronto.

A little after four o’clock, Pippa meandered over to Dot’s house carrying a bottle of wine she had been keeping in reserve and wondering if she could possibly be pregnant in spite of the vestigial coil still lodged in her uterus like astronaut litter abandoned on the moon.

The Private Lives of Pippa Lee, by Rebecca Miller. The time phrase is “A little after four o’clock.” The source was Literature.

Auth

Auth defaults to off. Settings and Log show a lock because they need a sign-in.

ModeBehaviour
offNo credential for quote tools. Admin tools and generate_traffic still need a credential. A tool can still be locked on its own under Settings → Tool gates.
writeupdate_settings and push_quote need a key. Read tools stay open. Admin tools need the admin scope.
allEvery tool except describe_server needs Authorization: Bearer <key> or MCP_API_KEY. Admin tools need the admin scope.
VariableWhat it does
ADMIN_USERSettings sign-in name. Default demo.
ADMIN_PASSWORDSettings sign-in password. Default demo on this laptop. On a public bind (HOST=0.0.0.0, Render, or a container) there is no default: set this before the process starts, then restart. It is not stored in Settings and is not part of an export.
RATE_LIMITMax tool calls per minute. Default 60.

Issue and revoke keys on /admin. /health only means the process is up; /test runs the quote checks.

Settings → Backup downloads the clock, auth, protocols, schedule (including client push), tool gates, and saved users (password hashes). Import restores that file. API keys and the MQTT password are not in it. Log → Export log and trace downloads counters, errors, the call trace, and the audit trail.

Settings → Tool gates can disable a tool or lock it so it needs a credential even when auth is off. describe_server stays available and stays open.

Settings → Users adds a name and password with scopes read, write, or admin. The built-in admin name comes from ADMIN_USER and is not replaced here. Settings → API keys issues a bearer key. The secret is shown once.

Settings → Protocols turns stdio, Streamable HTTP, and SSE on or off. At least one stays on. The same tab can hide the HTML pages until sign-in. describe_server and update_settings still answer on a protocol that is on, so a turned-off transport can be turned back on.

Publish

Publish from the package that contains src/ and data/, not from this git tree. See docs/PUBLISHING.md. The npm tarball ships src/, data/ (books and voices), the README, docs/screenshots/, docs/icon.png, docs/icon.svg, server.json, clients/, LICENSE, and NOTICE.

npm keywords: mcp, model-context-protocol, mcp-server, literature-clock, ink-clock, quotes, books, voices, stdio, streamable-http, cursor, vscode, claude, clock.

Related clocks

ClockWhat it is
Alexa Ink ClockAlexa skill Ink O'Clock. A line for the minute, read aloud.
Chrome Ink ClockNew-tab and toolbar clock. Literature reads the public literature-clock. Books and original voices stay on the machine.
Stanza ClockChrome new-tab word clock. 8×8 and 16×16 letter plates in seven languages.
ESP-WordClock8x8English 8×8 WS2812 word clock for ESP32-S3 and ESP8266. The hardware face Stanza Clock matches.

Author

Markus van Kempen · github.com/markusvankempen

No bug too small, no syntax too weird.

來源:README.md,提交 246cbc1

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v1.6.2最新Sep 26, 2026

評分

已滿足適用檢查項的 40%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。