huiwen-mcp
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., "@huiwen-mcp 查一下《百年孤独》的馆藏信息"
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.
huiwen-mcp
Model Context Protocol (MCP) Server for the Huiwen Library Management System (Libsys / OPAC) — An AI-oriented read-only data gateway for libraries: Enables AI clients like Claude / Cherry Studio / DeepSeek to securely and audibly retrieve catalog records, item availability, circulation statistics, and union catalogs.
An official adaptation layer developed by a university library, adhering to the security baseline of read-only by default, least privilege, and full-chain auditing.
Protocol: Model Context Protocol (Anthropic open standard, same technical approach as Yale Library's catalog integration)
Runtime: Python ≥ 3.10 · FastMCP 3.x
Data Sources:
demo(zero-dependency demonstration) /opac(Huiwen OPAC public web protocol) /oracle(Huiwen Libsys database read-only direct connection)License: Apache-2.0 (recommended, see License & Compliance)
Table of Contents
Related MCP server: dms-mcp-server
Features
Capability | Description |
🔍 Catalog Search | Multi-field / CLC / Location / In-library filter / Sort / Pagination |
📚 Bibliographic Details | Full bibliographic record for a single item, all holding item status & circulation statistics |
✅ Item Availability | Quick check of borrowable status by ISBN / Barcode / Title |
🔥 Hot & New Books | Popular borrowing rankings, new book alerts for the last N days |
🧭 Classification Browsing | Real-time hit counts for CLC classifications/prefixes |
📊 Statistics | Total holdings / By location / By classification |
🤝 Union Catalog | PROCAT cross-library union search (optional, disabled by default, JWT authentication) |
👤 Patron Data (admin) | Current borrowing / Borrowing history / Fines (PII masked by default) |
🛡️ Security | Authentication → Rate Limiting → PII/Patron Gating → JSONL Auditing; read-only by default |
🔌 Transport | stdio (in-process) / Streamable HTTP (service-oriented) |
🐳 Deployment | Docker image (non-root, reproducible build); production/gateway-level authentication scheme in |
🧩 Pluggable Data Sources |
|
Design Trade-off: Write operations (renewal, reservation, interlibrary loan ordering) are intentionally not implemented — this project only provides "secure and auditable reading"; all write paths are delegated to the original business systems and manual processes.
System Design Philosophy
Positioning: Data Gateway / Skill Layer, Not a Database Proxy
AI clients (large language models) never directly connect to the Huiwen database. All queries are encapsulated through a controlled tool layer:
┌─────────────── AI 客户端(Claude / Cherry Studio / 自研 Agent / 本地 LLM) ───────────────┐
│ │ │
│ stdio(子进程协议) │ Streamable HTTP(服务化 / 网关 / SSO) │
└──────────────────────────────────────┼────────────────────────────────────────────────────┘
▼
┌───────────────────────────────────────────────────────────────────────────────────────┐
│ huiwen-mcp(FastMCP 3.x) │
│ ┌─────────────── 安全链 _guard ───────────────┐ │
│ │ 认证(Auth) → 限流(TokenBucket) → 门控(PII/读者) │ ← 每个工具必经 │
│ └──────────────────────────────────────────────┘ │
│ │ 工具层:search_books / get_book_detail / union_search / get_reader_* / … (12 个) │
│ └──────────────────────────────────┬───────────────────────────────────────────────────┘
▼
┌───────────────────────────────────────────────────────────────────────────────────────┐
│ 适配器(可插拔数据源,统一 CatalogBackend 接口) │
│ ├─ OracleBackend:白名单参数化 SQL(db/queries.py 封闭集) → 汇文 Libsys 只读账号 │
│ ├─ OpacBackend:白名单参数调汇文 OPAC 公开网页协议 → opac 站点 │
│ └─ DemoBackend:内置样例数据 → 离线演示/测试 │
└───────────────────────────────────────────────────────────────────────────────────────┘Single Responsibility per Layer: The adapter is only responsible for data retrieval;
_guardis only responsible for security; auditing independently writes JSONL logs; the upper-layer AI only interacts with tool signatures, unaware of backend differences (three backends, same signatures).Secure by Default:
data_source=demoruns with zero dependencies;opac/oraclerequire explicit configuration; patron-sensitive tools require an admin token; write operations are disabled by default; external union services are disabled by default.
Why MCP
MCP is an open standard for connecting AI to "databases/business systems" (Anthropic released Nov 2024, ecosystem includes GitHub/cloud vendors/database vendors). Choosing an open standard over a private API ensures: client replaceability (Claude/Cherry Studio/DeepSeek/custom Agent), service reusability across multiple systems, and long-term freedom from vendor lock-in — this is the same path Yale Library took with MCP for catalog integration.
FastMCP provides stdio / HTTP dual transport for server implementation, supporting both in-process and service-oriented deployment with a single codebase.
Transport Mode Selection: stdio vs HTTP
stdio: Launched in-process with the client, zero operations overhead, lowest latency, suitable for personal/single-machine integration with AI desktop clients.
HTTP (Streamable HTTP): Independent service, suitable for multi-user/centralized deployment; can be fronted by an OAuth2/JWT reverse proxy and campus unified identity for centralized auditing.
Implementation Technical Approach
Concern | Approach |
MCP Server |
|
Strict Tool Signature Constraints | FastMCP 3.x rejects tool functions with |
Authentication Chain |
|
Oracle Backend |
|
OPAC Backend | Whitelist parameters construct Huiwen public web protocol ( |
Union Catalog |
|
Configuration |
|
Models |
|
Key Contracts (All Verified Against Live Systems)
OPAC: Search results
<ol id="search_book_list">→<li class="book_list_info">, title/call number/holding copies/available copies/hit count; detail page item table; hot list.Union PROCAT:
POST(GET→405); authentication via query parametertk=(JWT issued by OPAC patron sessiongetReaderJwt);items[].logic="1"(AND)/"2"(OR); field mappingany/title/author/subject/isbn/clcNumber/publisher/series. Seedocs/union-catalog-search.mdfor details.
⚠️ OPAC / Union are vendor-closed or third-party systems; contracts may change with deployment versions. All integration documentation is based on "live system verification" and validated using
tests/test_*_live.py.
Quick Start
1) Installation
git clone <your-repo-url> && cd huiwen-mcp
# 方式 A:uv(推荐)
uv sync
# 方式 B:pip
python -m venv .venv
. .venv/bin/activate
pip install -e .2) Run with Zero Configuration (demo data source, offline)
HUIWEN_DATA_SOURCE=demo uv run huiwen-mcp # stdio 模式
HUIWEN_DATA_SOURCE=demo HUIWEN_TRANSPORT=http uv run huiwen-mcp # HTTP 模式demo includes sample bibliographic/patron data, suitable for smoke testing, development testing, and integration teaching.
2b) One-Click Docker Deployment
docker build -t huiwen-mcp:latest .
docker run --rm -it -e HUIWEN_DATA_SOURCE=demo huiwen-mcp:latest # stdio,离线可跑
# 服务化(HTTP + 认证 + 审计)
docker run -d --name huiwen -p 8765:8765 \
-e HUIWEN_TRANSPORT=http -e HUIWEN_DATA_SOURCE=opac \
-e HUIWEN_OPAC_BASE_URL=https://opac.example.edu.cn \
-e HUIWEN_AUTH_ENABLED=true -e HUIWEN_AUTH_BEARER_TOKEN=<强随机> \
-v huiwen-audit:/var/log/huiwen huiwen-mcp:latestMore (Oracle 11g thick / compose / reverse proxy-level authentication with campus CAS) in docs/deployment-guide.md.
3) Connect to Real Data Sources (opac / oracle)
Copy .env.example to .env and fill in the values (.env is git-ignored):
cp .env.example .env
# 编辑 .env:设置 HUIWEN_DATA_SOURCE 与对应凭据
HUIWEN_DATA_SOURCE=opac
HUIWEN_OPAC_BASE_URL=https://opac.example.edu.cn # 你们学校 OPAC 地址Or use config.local.json (sensitive configuration auto-loaded, not committed to repository).
Configuration (Environment Variables / .env)
All configurations can be injected via environment variables (prefix HUIWEN_), and also support .env files (auto-loaded).
Priority: Environment Variables > Explicit config.json / CONFIG_PATH > config.local.json Auto-Merge > Built-in Defaults.
General
Variable | Description | Default |
|
|
|
|
|
|
| HTTP listening |
|
| Whether to output patron sensitive fields (requires admin) |
|
| JSONL audit log path (leave empty to disable) | Empty |
| Local sensitive configuration file name |
|
OPAC
Variable | Description | Default |
| Huiwen OPAC root URL | |
| Search timeout (recycle bin is slow 15-40s, allow enough time) | 25s |
| Whether to allow personal data after patron login (disabled by default) | |
| Union catalog switch (disabled by default) | |
| Union service URL | |
| Tenant code | |
| Patron session JWT (entire |
Oracle
Variable | Description |
|
|
| Read-only account (strongly recommended) |
|
|
| Instant Client directory for thick mode |
| Semantic constraint for read-only (default true) |
| Connection pool size |
Security
Variable | Description |
| Whether to enable Bearer authentication (must enable in production) |
| Static Bearer Token |
| Comma-separated admin tokens (for patron/write-related export tools) |
| Token bucket rate limiting |
Tool List
Tool | Description | Token Required |
| Catalog search (field/CLC/location/in-library filter/sort/pagination) | — |
| Full bibliographic information for a single item (including all holding items and circulation statistics) | — |
| Check item availability by ISBN/Barcode/Title | — |
| Popular borrowing rankings (can be filtered by CLC category) | — |
| New book alerts for the last N days | — |
| CLC classification browsing/real-time prefix hit counts | — |
| Cross-library union catalog read-only search (disabled by default) | Configuration |
| Holdings statistics (total/by location/by classification) | — |
| Patron's current borrowing | admin |
| Patron's borrowing history | admin |
| Patron's fines | admin |
| Data source and service status | — |
For functional descriptions and integration assessment of Huiwen ACS/SIP2 interface services, see docs/huiwen-acs-sip2-interface-description-and-integration-assessment.md (authoritative field mapping, read-only subset candidates, explicitly prohibited items).
Patron tools are masked by default (include_pii=false does not return ID numbers/contact information; true requires admin).
Client Integration Examples
Claude Desktop / MCP-Supported Desktop Clients
{
"mcpServers": {
"huiwen": {
"command": "/path/to/uv",
"args": ["--directory", "/path/to/huiwen-mcp", "run", "huiwen-mcp"],
"env": { "HUIWEN_DATA_SOURCE": "demo" }
}
}
}Remote HTTP (Requires Authentication Gateway Setup)
HUIWEN_TRANSPORT=http HUIWEN_HOST=0.0.0.0 HUIWEN_PORT=8765 uv run huiwen-mcpClients use ${MCP_SERVER_URL} to connect to http://<host>:8765/mcp/ (Streamable HTTP).
When HUIWEN_AUTH_ENABLED=true is enabled, the token is passed as a tool parameter token with each call;
the HTTP Authorization header is not consumed by the server (see deployment guide §3.2).
Use Cases
User | Scenario |
Patron | "Is 'The Three-Body Problem' available, which floor, how many copies can be borrowed, what's popular nearby" — one-stop for finding books/studying/research |
Reference Librarian | Auto-check catalog/holdings → generate draft response → manual review (Copilot mode) |
Subject Librarian | Subject bibliographies, literature support statistics, departmental purchase recommendation reports |
Acquisitions/Cataloging | ISBN deduplication, gap analysis, new book alerts, metadata validation |
Library Leadership | Holdings/circulation statistics charts, data weekly reports |
AI Librarian Portal | As the core data layer for intelligent Q&A/intelligent book recommendations |
Consortium Building | Cross-library union search (gap found → search union → formal interlibrary loan) |
For complete suggestions (including locally deployed LLM + RAG layered approach and domestic/international benchmarking), see docs/service-and-application-suggestions.md.
Security & Compliance
Read-Only by Default: All tools are read-only; write operations (renewal/reservation/interlibrary loan ordering) are intentionally not implemented.
Whitelist SQL: The Oracle backend only executes the parameterized SQL closed set within
db/queries.py, no free SQL.Full-Chain Gating: Authentication → Rate Limiting → Patron/PII Gating → Auditing (JSONL). Patron personal data requires an admin token and is masked by default.
Authentication Contract (Verified Against Live System): The token is passed via the tool parameter
token(an optional parameter for each tool;_guardextracts it from the parameters and compares it withHUIWEN_AUTH_BEARER_TOKEN). The HTTPAuthorizationheader passthrough is not implemented — transport layer TLS/unified identity is handled by the reverse proxy gateway; huiwen-mcp's own authentication is the second line of defense behind the gateway. Tokens are not written to audit logs (_guardpops them before recording).Secrets Not Committed to Repository: DSN/password/JWT/site URLs are only passed via environment variables or
config.local.json(git-ignored). The repository contains no real deployment data (see NOTICE).External Services Handled with Caution: The Union PROCAT is a third-party multi-tenant system, disabled by default; confirm authorization with the union/service provider before enabling. OPAC is closed-source, has had public vulnerabilities historically; the adapter only uses whitelist parameters.
Vulnerability reporting and handling are in SECURITY.md.
Testing
File | Content | Run Command |
| Demo backend smoke test (offline) |
|
| stdio integration/authentication regression (demo) |
|
| Live database integration (disabled by default) |
|
| Union PROCAT live system (disabled by default) |
|
Live database/live system tests are disabled by default (require local explicit setting of HUIWEN_LIVE_* to execute) to avoid touching any real systems.
Docker images are not built/published by default (the release strategy is "publish only source code and documentation"): if an image is needed, please docker build locally (add --build-arg WITH_INSTANT_CLIENT=true for Oracle thick mode).
Project Structure
huiwen-mcp/
├── src/huiwen_mcp/
│ ├── server.py # FastMCP 装配、stdio/http 启动、main()
│ ├── config.py # 配置:env/.env/config.local.json 分层合并
│ ├── audit.py # JSONL 审计
│ ├── adapters/
│ │ ├── base.py # CatalogBackend 抽象
│ │ ├── demo.py # 内置演示数据
│ │ ├── opac.py # 汇文 OPAC 网页协议(含 union_search)
│ │ └── oracle.py # Libsys 数据库只读(thin/thick)
│ ├── db/queries.py # 白名单参数化 SQL(Oracle 后端唯一 SQL 来源)
│ ├── models/schemas.py # pydantic 结果模型
│ └── tools/catalog.py # 12 个 MCP 工具 + _guard 安全链
├── docs/ # 表结构 / 联盟契约 / 服务与应用建议 / 部署指南 / SIP2 评估
├── tests/ # demo/stdio/oracle-live/union-live
├── Dockerfile / compose.yaml / .dockerignore
├── .env.example / config.example.json / config.local.json(忽略)
├── LICENSE / NOTICE / SECURITY.md / CONTRIBUTING.md / CODE_OF_CONDUCT.md
└── pyproject.tomlRoadmap
Phase 1: Read-only search MCP (demo + opac + oracle three backends)
Phase 2: OPAC / Oracle live database integration testing, Union catalog integration testing (contract verified + token scheme)
Phase 2 Remaining: Docker image (non-root, reproducible build) + deployment guide (including reverse proxy-level authentication template)
Released:
v1.0.0tag + GitHub Release (source code and documentation; no CI/workflows, Docker images not automatically built)OAuth2/JWT gateway implementation for campus CAS / unified service portal (template ready, requires on-site configuration)
Phase 2.5/3 Candidate: Huiwen ACS/SIP2 read-only subset (assessment in docs/huiwen-acs-sip2-interface-description-and-integration-assessment.md)
Phase 3: RAG vector database + local LLM for intelligent book recommendations / reference consultation (see docs/service-and-application-suggestions.md)
Phase 4: Huiwen new-generation platform OpenAPI integration
License & Compliance
Open Source License Version Suggestion
This project recommends using the Apache License 2.0 (the repository includes the complete LICENSE):
Permissive: Allows universities, vendors, and cloud platforms to freely use/modify/redistribute (including commercial use) as long as the copyright and license notice are retained—facilitating adoption by AI toolchains and third-party systems.
Patent grant: Apache-2.0 explicitly grants a patent license from contributors (Section 3), making it clearer and more "anti-litigation" when multiple institutions/parties (multiple universities, technology vendors) contribute jointly.
Contributor terms standardization: Implicitly grants a project license (Section 5, Contribution Grant), eliminating the need for each contributor to sign a separate CLA, consistent with common GitHub open-source project practices.
Differentiation: Compared to MIT, Apache-2.0 is more suitable for infrastructure-type projects formally released by institutions and potentially maintained by multiple parties over the long term.
If your library prefers a "minimalist style," you can revert to MIT at any time: simply replace the full
LICENSEfile, changelicenseinpyproject.tomlback to{ text = "MIT" }, and update this section in the README.
Compliance Statement (Important)
Contains no vendor/third-party source code: This project is an independent interoperability layer for the closed-source Huiwen/Libsys. It does not contain any proprietary code from Huiwen or the consortium. The OPAC/consortium contract is based solely on public web protocols and real-site response records. See NOTICE.
No deployment-sensitive data is published with the repository: Actual DSNs, account passwords, OPAC login instances, consortium JWTs, reader PII, or vendor
SECRET_KEYare not in the repository (SECURITY.md/CONTRIBUTING.md has set red lines strictly prohibiting any suspected sensitive data from being committed).Trademarks:
Huiwen,Libsys, andOPACare trademarks/product names of their respective owners (e.g., Jiangsu Huiwen Software). This repository uses them only for interoperability reference, not implying endorsement or affiliation.Before using this software, please confirm the authorization and usage boundaries with Huiwen Software, the consortium service provider, and your library's IT center.
Troubleshooting
Phenomenon | Handling |
"Backend not supported" | Verify |
Oracle | For 11g use |
OPAC search timeout | The site side is slow (15–40s common); increase |
| Consortium not enabled or token missing → enable configuration and fill in JWT. |
Consortium returns | JWT expired → re-login to OPAC, get |
Framework rejects tool registration ( | Tool functions must have explicit parameters; do not use |
Reader tool returns "requires admin token" | Use a token from |
Available Tools
12 toolsbrowse_classificationB
中图法分类浏览:传入分类号前缀(如 'T')返回该类目馆藏统计。
Inputs: token, prefix. Returns: object
get_availabilityA
按 ISBN / 条码 / 题名查询馆藏复本在馆(可借)状态。
Inputs: isbn, title, token, barcode. Returns: object
get_book_detailA
获取单册书目完整信息(含全部馆藏复本状态与流通统计)。
Inputs: marc_no (required), token. Returns: object
get_hot_booksA
热门借阅图书排行(可按中图法大类过滤)。
Inputs: token, top_n, cls_no, period. Returns: object
get_new_arrivalsC
近 N 天新书通报。
Inputs: clc, days, token. Returns: object
get_reader_borrowingA
读者当前借阅(需 admin 认证令牌)。
Inputs: cert_id (required), token, include_pii. Returns: object
get_reader_finesB
读者欠款 / 罚款明细(需 admin 认证令牌)。
Inputs: cert_id (required), token, include_pii. Returns: object
get_reader_historyC
读者借阅历史(需 admin 认证令牌)。
Inputs: cert_id (required), token, include_pii. Returns: object
get_statisticsD
馆藏统计。
Inputs: token, metric, range_desc. Returns: object
get_system_statusB
返回当前数据源与后端健康状态。
Inputs: token. Returns: object
search_booksB
检索馆藏书目。返回题名/责任者/出版社/ISBN/馆藏地在馆信息列表。
Inputs: query (required), clc, page, sort, +7 more. Returns: object
union_searchA
跨馆联盟联合目录检索(OPAC 结果页「联盟图书馆检索」的外部 PROCAT 服务)。
默认关闭,需 opac.union_enabled=true 且配置 union_base_url / union_tenant / union_token(读者会话 JWT,由 OPAC reader 登录取得,见 docs/联盟联合目录检索.md)。 仅只读检索,不实现馆际借阅下单(写操作)。未启用或配置不完整时返回明确提示。
Inputs: query (required), page, field, logic, +2 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
Most tools have clearly distinct purposes: book searching, detail retrieval, availability checking, hot books, new arrivals, classification browsing, statistics, system status, union search, and reader-specific operations. However, get_reader_borrowing, get_reader_history, and get_reader_fines all relate to reader accounts and could be conflated if descriptions were less precise, but their names clearly differentiate them.
All tool names follow a consistent verb_noun pattern using snake_case: search_books, get_book_detail, get_hot_books, etc. The pattern is predictable and makes the toolset easy to navigate.
With 12 tools, the count is well within the ideal range. The toolset covers public catalog operations, reader management, and system administration without being excessive or minimal.
The toolset provides comprehensive read-only access to library catalog and reader information. However, it is explicitly limited to read-only operations, lacking any write capabilities (e.g., placing holds, renewing items) which are natural expectations for a library system. The union_search tool's description also notes it does not implement interlibrary loan ordering, which is a gap.
Maintenance
Related MCP Connectors
Read-only MCP server exposing a user ORANO library to their own AI agent.
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
Cloud-hosted MCP server for secure AI access to enterprise data sources via CData Connect AI.
Read-only MCP for AI usage profiles, leaderboards, stats, and docs; no writes or private data.
Related MCP Servers
- AlicenseAqualityDmaintenanceRead-only MCP server that connects AI clients to Crescender's school asset, loan, member, and asset-comms API.6MIT
- AlicenseAqualityBmaintenanceRead-only MCP server that lets AI clients query DMS repositories through a local bridge, supporting tools for health checks, listing connections and items, retrieving item info, and reading documents. Credentials are handled securely via a separate broker.7MIT
- FlicenseNot gradedqualityDmaintenanceRead-only MCP server for AI clients to browse and search project files securely, with configurable permissions, virtual paths, and key-based access.-
- FlicenseBqualityDmaintenanceA secure, read-only MCP server that enables AI assistants to inspect transactions, vendor performance, wallet balances, and analytics through validated REST API calls.19-