Tự host Hister: công cụ tìm kiếm cá nhân trên VPS
Chạy Hister trên VPS để tìm toàn văn trang đã đọc và file đã lưu, với cài binary hoặc Docker, TLS, đăng nhập và MCP endpoint qua HTTP API.
Hister là gì và không phải là gì
Hister là một công cụ tìm kiếm cá nhân do bạn tự host. Nó lập chỉ mục toàn văn các trang bạn đã truy cập và các file bạn lưu, sau đó cho phép bạn tìm kiếm trong tập dữ liệu đó từ giao diện web, client terminal, HTTP API hoặc trợ lý AI (trí tuệ nhân tạo). Hister trả lời một câu hỏi: tôi đã đọc thông tin đó ở đâu.
Phần lớn người đọc biết đến ý tưởng này qua SearXNG, nhưng hai công cụ này không giống nhau. Nếu tên bạn biết là Searx cũ hơn, dự án đó không còn được maintain và không có commit code nào kể từ 2023, README của dự án hiện trỏ người đọc đến Hister, dự án mới của tác giả. Searx và SearXNG vẫn là hai dự án riêng biệt, còn SearXNG là fork vẫn được maintain, nên đây là lựa chọn phù hợp để dựng một instance metasearch mới. SearXNG là một proxy metasearch. Query của bạn được gửi đến nó, nó thay bạn hỏi các engine khác, rồi trả về kết quả đã loại bỏ tracking. Index thuộc về các engine đó. Hister tự xây dựng index từ nội dung bạn cung cấp: các trang được browser extension capture, browser history được import, các URL được crawl và các file trong những directory bạn chỉ định. Một instance SearXNG tự host cho phép bạn truy cập riêng tư vào web công khai. Hister cho phép bạn tìm kiếm trong nội dung mình đã đọc. Hai công việc này khác nhau, nên chạy cả hai trên cùng một máy là bình thường. Nếu làm vậy, bạn nên biết SearXNG thực sự che giấu được bao nhiêu hoạt động tìm kiếm của bạn, vì nó thay IP của bạn bằng IP của server khi truy vấn các engine, chứ không che giấu chính các query.
Hister là phần mềm tự do theo AGPLv3 (GNU Affero General Public License, version 3) hoặc các version sau. Nó không có telemetry và không cần cloud service. Hướng dẫn này cố định ở version v0.17.0, là release hiện tại vào 2026-07-28. Vào 2026-10-12, release hiện tại là v0.20.0. Các command bên dưới được viết cho v0.17.0. Một số ít tính năng được đề cập ở đây nhưng xuất hiện sau đó sẽ được đánh dấu bằng release đã bổ sung chúng. Hãy kiểm tra trang releases để biết tag hiện tại trước khi copy bất kỳ thứ gì, sau đó cố định ở tag bạn tìm thấy.
Vì sao nên tự host Hister trên VPS
Một index chỉ hữu ích khi đầy đủ. Index chỉ đầy đủ nếu server đang chạy trong lúc bạn đọc. Laptop ngủ trong nửa ngày. Các trang bạn mở trên điện thoại trong thời gian đó không bao giờ đến được server, và một lần import chạy qua đêm cũng không bao giờ bắt đầu. VPS (virtual private server) luôn hoạt động, vì vậy mọi thiết bị của bạn đều ghi dữ liệu vào cùng một index và crawler tiếp tục chạy trong lúc bạn ngủ.
Lý do thứ hai là tách biệt. Thiết lập user_handling: true trong phần app cho mỗi account có credentials riêng và bộ sưu tập tài liệu riêng trên cùng một instance. Khi đó, một server có thể phục vụ cả gia đình hoặc một team nhỏ mà không ai tìm kiếm nội dung đọc của người khác.
Lý do thứ ba là hạ tầng kết nối. VPS đã có hostname public và certificate, đây là những gì browser extension cần để kết nối đến server từ một network mà bạn không kiểm soát. Cặp này cũng được dùng cho mục đích khác trên máy, vì openGym đăng ký passkey đầu tiên của nó với hostname đang hoạt động tại thời điểm đó, nghĩa là phải chốt hostname và certificate trước khi tạo account đầu tiên.
Cách cài đặt 1: binary release
Hister phát hành một binary cho mỗi platform. Tải binary cùng với file checksum, rồi xác minh trước khi cài đặt.
cd /tmp
curl -LO https://github.com/asciimoo/hister/releases/download/v0.17.0/hister_0.17.0_linux_amd64
curl -LO https://github.com/asciimoo/hister/releases/download/v0.17.0/hister_0.17.0_checksums.txt
sha256sum --ignore-missing -c hister_0.17.0_checksums.txtKết quả hợp lệ chỉ có một dòng hister_0.17.0_linux_amd64: OK. Dòng FAILED cho biết file tải xuống bị hỏng hoặc đã bị thay đổi. Hãy tải lại thay vì cài đặt.
Cài binary, sau đó tạo system account và các thư mục mà binary sẽ sử dụng.
sudo install -m 755 /tmp/hister_0.17.0_linux_amd64 /usr/local/bin/hister
sudo useradd --system --home-dir /var/lib/hister --shell /usr/sbin/nologin hister
sudo install -d -o hister -g hister -m 750 /var/lib/hister
sudo install -d -m 755 /etc/hister
sudo hister create-config /etc/hister/config.ymlcreate-config ghi một file cấu hình mặc định và đồng thời xác nhận binary chạy được trên máy này. Nếu tải nhầm binary cho kiến trúc khác, lệnh sẽ fail tại đây với cannot execute binary file: Exec format error.
Chỉnh một vài setting cần thiết. Có thể giữ nguyên phần còn lại của file được tạo.
app:
directory: /var/lib/hister
access_token: 'paste-a-long-random-string-here'
server:
address: 127.0.0.1:4433
base_url: https://hister.example.comTạo token bằng openssl rand -hex 32. File này hiện chứa credential, vì vậy hãy hạn chế quyền truy cập trước khi service khởi động.
sudo chown root:hister /etc/hister/config.yml
sudo chmod 640 /etc/hister/config.ymlChạy bằng systemd
Viết /etc/systemd/system/hister.service:
[Unit]
Description=Hister personal search engine
After=network-online.target
Wants=network-online.target
[Service]
User=hister
Group=hister
Environment=HISTER_CONFIG=/etc/hister/config.yml
ExecStart=/usr/local/bin/hister listen
Restart=on-failure
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/hister
[Install]
WantedBy=multi-user.targetHISTER_CONFIG là biến môi trường được tài liệu quy định cho đường dẫn cấu hình, nên unit không phụ thuộc vào thư mục home của account hister. ProtectSystem=strict đặt toàn bộ filesystem ở chế độ chỉ đọc đối với service này. Vì vậy, ReadWritePaths phải chỉ rõ thư mục dữ liệu. ProtectHome=yes ẩn /home khỏi service, nên thư mục được theo dõi bên dưới /home sẽ hiển thị là rỗng đối với indexer. Xóa dòng đó nếu bạn cần index các file tại đó.
sudo systemctl daemon-reload
sudo systemctl enable --now hister
systemctl status hister --no-pager
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:4433/Bất kỳ mã trạng thái HTTP nào được in ra bởi lệnh cuối cùng đều có nghĩa là process đang listen. curl: (7) Failed to connect có nghĩa là process không listen, còn journalctl -u hister -n 50 --no-pager sẽ cho biết lý do.
Đường dẫn cài đặt thứ hai: Docker Compose
Image được phát hành trên GitHub container registry, với một tag cho mỗi bản phát hành.
services:
hister:
image: ghcr.io/asciimoo/hister:v0.17.0
container_name: hister
user: '1000:1000'
restart: unless-stopped
environment:
- HISTER__SERVER__ADDRESS=0.0.0.0:4433
- HISTER__SERVER__BASE_URL=https://hister.example.com
- HISTER__APP__ACCESS_TOKEN=${HISTER_ACCESS_TOKEN}
volumes:
- ./data:/hister/data
ports:
- 127.0.0.1:4433:4433Mỗi khóa cấu hình đều có biến môi trường override theo dạng HISTER__<SECTION>__<KEY>, dùng hai dấu gạch dưới làm dấu phân cách. Vì vậy, khi triển khai bằng container, bạn không cần mount file cấu hình. Giữ HISTER_ACCESS_TOKEN trong file .env nằm cạnh file compose. Nếu muốn chỉnh sửa file, docker run --rm ghcr.io/asciimoo/hister:v0.17.0 create-config > config.yml sẽ in ra các giá trị mặc định.
Hai dòng trên rất dễ cấu hình sai. Bạn nên hiểu rõ cả hai.
Địa chỉ bên trong container phải là 0.0.0.0:4433. Container có network namespace riêng. Vì vậy, process bind vào 127.0.0.1 trong container chỉ có thể được truy cập từ bên trong container đó, còn port đã publish sẽ không có đích để forward đến.
Port được publish phải viết là 127.0.0.1:4433:4433, không phải 4433:4433. Docker publish port bằng cách chèn các netfilter rule riêng. Các rule này được đánh giá trước các rule của ufw. Vì vậy, một 4433:4433 thông thường vẫn có thể truy cập từ Internet, ngay cả trên máy mà ufw status hiển thị port đã bị đóng. Bind phía host vào 127.0.0.1 sẽ chỉ cho reverse proxy truy cập vào dịch vụ. Lỗi tương tự áp dụng cho mọi container trên server. Docker Compose trên VPS trình bày phần còn lại.
Dòng user: '1000:1000' chạy container với UID 1000 và GID 1000. Đây là account được dùng trong Docker example của chính project. Vì vậy, ./data phải cho account đó quyền ghi. Nếu không, container sẽ dừng khi khởi động với lỗi permission. sudo chown -R 1000:1000 ./data sẽ xử lý việc này. Nếu bạn chưa quen với các con số này, hãy đọc container ghi file bằng UID và GID nào trước.
Vì sao personal search index là thứ tệ nhất để public ra Internet
Hister mặc định listen trên 127.0.0.1:4433, và đây là lựa chọn có chủ ý. Hãy xem index chứa gì sau một tháng sử dụng: các trang wiki nội bộ, hóa đơn, support ticket bạn đã mở khi đăng nhập, các trang reset password và toàn bộ nội dung của mọi thứ khác bạn đã đọc. Tài liệu dự án nêu rõ: “Hister truyền toàn bộ browsing history của bạn, cùng nội dung trang, đến và đi từ server.”
Một database password bị lộ vẫn phải được crack. Một personal index bị lộ ở dạng plain text và đã có thể search ngay, nên cần được bảo vệ cẩn thận hơn cả self-hosted app nhỏ mà nó trông giống.
Từ đó có 2 điều cần lưu ý. Mặc định Hister không yêu cầu authentication, nên chỉ một reverse proxy cũng có thể public bản sao có thể search của những gì bạn đã đọc cho bất kỳ ai biết hostname. MCP endpoint cũng mặc định được serve tại /mcp, và nếu không có token, bất kỳ client nào truy cập được endpoint này đều có thể chạy search trên index.
Hãy cấu hình authentication trước khi service rời localhost lần đầu. Một user chỉ cần app.access_token, tức một shared secret được browser extension, terminal client và mọi MCP client gửi lên. Với nhiều người dùng, hãy đặt user_handling: true rồi tạo các account:
sudo -u hister hister create-user alice --admin --config /etc/hister/config.ymlCommand sẽ yêu cầu password có ít nhất 8 ký tự. Mỗi account có bộ tài liệu riêng và một personal API token. Owner có thể tạo lại token từ profile page hoặc dùng flag --regen-token trên hister update-user. Khi tạo token mới, token cũ bị vô hiệu hóa ngay lập tức. Vì vậy, sau đó phải cập nhật mọi device mà account đó đang sử dụng.
Không thay đổi app.public trừ khi bạn thực sự muốn bật chế độ này. Public mode cho phép search không cần authentication, xem preview, serve file và search qua MCP, nhưng vẫn chặn thao tác ghi, truy cập history và các thao tác admin.
Reverse proxy, TLS và firewall
Hister không tự phục vụ HTTPS, vì vậy hãy terminate TLS (bảo mật tầng truyền tải) ở phía trước Hister. Caddy là cách triển khai ngắn gọn nhất vì nó tự yêu cầu và gia hạn certificate qua ACME (môi trường quản lý certificate).
hister.example.com {
reverse_proxy 127.0.0.1:4433
}Reload bằng sudo systemctl reload caddy. Có 2 điều kiện phải đáp ứng trước khi có thể cấp certificate: các DNS record của hister.example.com phải trỏ đến server này, có thể là A record cho IPv4, AAAA record cho IPv6 hoặc cả hai; đồng thời port 80 phải được mở vì challenge HTTP-01 được xử lý tại đó. Let's Encrypt xác thực qua cả IPv6 và IPv4, đồng thời thử địa chỉ AAAA trước. Vì vậy, một AAAA record cũ còn trỏ đến host trước đó có thể làm xác thực thất bại dù A record đã đúng. Khi thiếu một trong hai điều kiện, trình duyệt sẽ nhận lỗi TLS thay vì trang web và log của Caddy sẽ lặp lại thông báo challenge thất bại.
Sau đó, hãy đóng tất cả các port khác.
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw statusPort 4433 cố ý không có trong danh sách đó. Public hostname không phải cách duy nhất để truy cập. Một onion service trỏ đến cùng loopback port cũng có thể truy cập index từ các thiết bị của bạn mà không cần DNS record hoặc mở bất kỳ inbound port nào.
server.base_url phải khớp với địa chỉ bạn nhập trong trình duyệt, bao gồm cả scheme. Nếu không khớp, giao diện sẽ tải với văn bản chưa được style và thiếu hình ảnh vì server tạo asset link từ base_url, sau đó trình duyệt yêu cầu các asset đó từ một origin không phản hồi. Cùng URL đó cũng được nhập vào browser extension.
Nạp dữ liệu vào index
Browser extension là công cụ thu thập chính. Cài extension từ Mozilla Add-ons hoặc Chrome Web Store, mở trang tùy chọn, đặt server URL thành https://hister.example.com rồi dán access token. Extension hỗ trợ token từ v0.18.0; khi kết nối đến server v0.17.0, extension dùng session của lần đăng nhập vào web interface. Sau đó, extension thu thập title, toàn bộ nội dung, HTML và favicon của từng trang bạn truy cập rồi gửi chúng đến server. Việc trích xuất diễn ra ở phía client, bên trong browser. Extension không kết nối đến bên thứ ba nào. Request duy nhất ra bên ngoài là request lấy favicon của trang.
Trích xuất ở phía client giúp tạo private index. Extension nhìn thấy trang đúng như bạn nhìn thấy, sau khi đăng nhập và sau khi trang được render. Vì vậy, trang wiki nội bộ hoặc bài viết trả phí vẫn được index đúng, còn server không bao giờ cần credential của bạn. Điều này cũng có nghĩa là mọi thứ bạn xem đều có thể được đưa vào index. Vì vậy, hãy cấu hình skip rules trước khi thêm nội dung.
Skip rules nằm trong rules.json khi cài đặt cho một user, hoặc nằm theo từng user trong database. Tab Rules trên web interface là cách dễ nhất để chỉnh sửa chúng. Đây là các regular expression của Go, được so khớp với toàn bộ URL:
^https://mail\.example\.com
^https://bank\.example\.com
.*?utm_source=Pattern như ^mail.example.com không bao giờ khớp, vì chuỗi được kiểm tra bắt đầu bằng https://. $ ở cuối cũng không khớp với bất kỳ URL nào có query string, vì query parameter vẫn được giữ nguyên khi so khớp.
Để import history hiện có, công cụ đọc database của chính browser. Vì vậy, lệnh này phải chạy trên máy chứa browser profile, tức laptop của bạn chứ không phải VPS. Cài cùng binary trên máy đó rồi trỏ binary đến server:
export HISTER_TOKEN='your-access-token'
hister import browser firefox -u https://hister.example.com -t "$HISTER_TOKEN"Import chạy dưới dạng job có thể tiếp tục, tên là browser-import-YYYY-MM-DD. Bạn có thể dừng job rồi chạy lại sau. Bookmark service cũng được import theo cách này. v0.17.0 hỗ trợ Linkwarden, Karakeep và Shaarli. v0.18.0 bổ sung Linkding, Readeck và Wallabag. v0.20.0 bổ sung Raindrop.io. Khi import lại từ Linkwarden, Karakeep, Shaarli, Linkding, Readeck hoặc Wallabag, công cụ chỉ lấy những mục mới hơn lần import trước.
Các file trên server được index bằng cách khai báo directory trong config:
indexer:
directories:
- path: '/var/lib/hister/documents'
label: 'documents'
filetypes: ['pdf', 'docx', 'md', 'txt']PDF, DOCX, Markdown, Org mode và các file text UTF-8 hợp lệ được đọc dưới dạng toàn bộ nội dung. Ảnh và video không nằm trong danh sách này. Vì vậy, image library cần một server index khuôn mặt, địa điểm và ngày tháng thay vì text. PhotoPrism và Immich là hai lựa chọn thường được so sánh cho công việc đó. Dùng hister index https://example.com để thêm một trang đơn lẻ. Việc chuyển toàn bộ website thành text sạch cho các công cụ khác là một công việc riêng, do các crawler tự host chuyển trang thành text sạch đảm nhiệm.
Search được thực hiện theo field. Vì vậy, bạn nên dành mười phút đọc query language:
"connection reset" domain:github.com added:<30d
title:(wireguard|nftables) -tutorial sort:-visitsField sort: được bổ sung trong v0.18.0. Khi dùng v0.17.0, hãy bỏ field này khỏi query thứ hai.
Trỏ coding agent vào index riêng của bạn qua MCP
MCP (model context protocol) là giao diện để assistant gọi các tool trên server. Hister cung cấp MCP tại POST /mcp trên cùng base URL, sử dụng transport streamable HTTP, và cung cấp search, get_preview cùng get_history. Cơ chế xác thực dùng cùng bearer token như phần còn lại của API. Nếu tool calling còn mới với bạn, tự viết một agent loop nhỏ là cách nhanh nhất để thấy một endpoint như endpoint này thực sự cung cấp gì cho assistant.
{
"mcpServers": {
"hister": {
"url": "https://hister.example.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
}
}
}Header X-Access-Token là lựa chọn thay thế cho Authorization.
Giá trị nằm ở nội dung mà agent tìm kiếm. Open web search trả về các kết quả đang được xếp hạng tại thời điểm hiện tại. Với phần mềm thay đổi nhanh, đó thường là documentation cho version mà bạn không chạy. Index riêng trả về đúng page mà bạn đã đọc và chọn lưu lại. get_preview cung cấp bản copy đã lưu, nên câu trả lời vẫn dùng được ngay cả khi page gốc không còn online. Nếu muốn có cả kết quả public, hãy cung cấp cho agent cả hai nguồn: một browser search skill dùng SearXNG thêm open web dưới dạng một tool riêng. Khi bạn chạy nhiều hơn một endpoint như vậy, host MCP server trên VPS là nội dung nên đọc, vì tất cả endpoint đều có cùng vấn đề về exposure.
Ổ đĩa, backup và bảo trì
Tài liệu ước tính mỗi trang được lập chỉ mục chiếm khoảng 100 KB, bao gồm cả bản xem trước đã nén. Vì vậy, một trăm nghìn trang chiếm khoảng 10 GB. Hệ thống không có quota. Hai setting thường bị nhầm là một: indexer.max_file_size_mb (mặc định 1 MiB) giới hạn kích thước của một file được theo dõi, còn server.max_batch_body_size (mặc định 40 MiB) giới hạn một request gửi đến batch API. Setting thứ hai được thêm từ sau v0.17.0. Ở v0.17.0, mỗi batch request bị giới hạn cố định ở mức 5 MB.
Directory được chỉ định bởi app.directory chứa index.db với các index file theo từng ngôn ngữ, db.sqlite3 cho account và job, data/html/ cho bản xem trước, và rules.json. Backup gồm service đã dừng, bản sao của toàn bộ directory đó và file cấu hình. hister export backup.json ghi tài liệu dưới dạng JSON để migration. Đây không phải là backup của server.
Có 2 lệnh bảo trì cần biết. hister reindex rebuild các search index. Bạn phải chạy lệnh này sau khi thay đổi setting của indexer. Nếu mức sử dụng memory tăng trong lúc import dữ liệu lớn, hãy đặt detect_languages: false trong section indexer rồi reindex. hister cleanup xóa các file preview và favicon mồ côi còn sót lại sau khi xóa dữ liệu.
Xóa dữ liệu là một query, vì vậy trước tiên hãy chạy ở chế độ dry run:
hister delete 'domain:example.com' --dry --verboseMột trang đã xóa sẽ xuất hiện lại nếu collector vẫn tiếp tục submit trang đó. Vì vậy, hãy thêm skip rule trước khi xóa.
Bạn có thể tự chạy một bản Hister chưa chỉnh sửa mà không phải thực hiện nghĩa vụ nào, vì AGPLv3 cho phép chạy chương trình chưa chỉnh sửa không giới hạn. Việc cung cấp bản sao cho người khác, dù có chỉnh sửa hay không, đi kèm một số điều kiện, chẳng hạn phải giữ nguyên thông báo bản quyền và licence, đồng thời cung cấp cho người nhận một bản sao của licence. Nếu bạn sửa đổi Hister và cho người khác sử dụng phiên bản đó qua network, licence cũng yêu cầu bạn cung cấp source đã sửa đổi cho họ.
Các dạng lỗi và chuỗi thông báo bạn sẽ thấy
Server không khởi động. Cổng 4433 đã được sử dụng hoặc file cấu hình có lỗi cú pháp YAML. sudo ss -lntp | grep 4433 cho biết tiến trình nào đang giữ cổng, còn journalctl -u hister -n 50 --no-pager in ra lỗi phân tích cú pháp.
Giao diện tải nhưng hiển thị bị lỗi. Văn bản bị xáo trộn và hình ảnh không hiển thị nghĩa là server.base_url không khớp với URL trên thanh địa chỉ. Dấu gạch chéo ở cuối cũng được tính là không khớp.
Extension không kết nối. Server URL trong extension phải khớp với base_url, server phải đang chạy và là phiên bản hiện tại, đồng thời firewall trên đường đi không được chặn kết nối mà không hiển thị thông báo trên trang. Firefox không ghi log của extension vào console thông thường. Hãy mở about:debugging#/runtime/this-firefox và kiểm tra extension Hister.
Container thoát khi khởi động. Lỗi quyền trên ./data có nghĩa là thư mục này thuộc về một UID khác 1000. File compose chạy container bằng account có UID 1000.
403 Forbidden từ route quản trị. POST /api/reindex và POST /api/cleanup chỉ dành cho admin khi bật chức năng quản lý user, nên account thông thường sẽ bị từ chối truy cập.
Mức sử dụng memory tăng trong lúc import. Nguyên nhân thường gặp là phát hiện ngôn ngữ trên history lớn. Hãy đặt detect_languages: false rồi chạy hister reindex sau đó.
FAQ
Hister khác SearXNG như thế nào?
SearXNG là một metasearch proxy: nó chuyển tiếp truy vấn của bạn đến các engine công khai và trả về kết quả sau khi loại bỏ tracking, nên index thuộc về các engine đó. Hister tự duy trì full-text index của những trang bạn đã truy cập và các file bạn lưu, nên nó trả lời câu hỏi “tôi đã đọc thông tin đó ở đâu”, còn SearXNG trả lời “web nói gì”. Hai công cụ giải quyết các vấn đề khác nhau, và nhiều người chạy cả hai trên cùng một server.
Đưa toàn bộ lịch sử duyệt web lên VPS có an toàn không?
Chỉ an toàn khi bạn xử lý việc giới hạn exposure trước. Hister bind vào 127.0.0.1:4433 và mặc định không yêu cầu authentication. Thiết lập app.access_token hoặc user_handling: true, đặt một reverse proxy có TLS ở phía trước, và đóng port 4433 trên firewall. Full-text index về những gì bạn đã đọc là plain text, nên bất kỳ ai truy cập được port này đều có thể đọc toàn bộ dữ liệu mà không cần crack gì.
Tôi có cần browser extension không, hay chỉ cần import history?
Import chỉ là thao tác backfill một lần. Nó đọc database history riêng của browser, nên chạy trên máy đang chứa browser profile, không phải trên server. Sau đó extension tiếp tục cập nhật index và lấy được cả các trang yêu cầu đăng nhập vì nó trích xuất nội dung trong browser sau khi trang render. Cách thiết lập phổ biến là import một lần, rồi cài extension.
Coding agent có thể tìm kiếm trong Hister index của tôi không?
Có. Hister là một MCP (model context protocol) server tại POST /mcp trên base URL của bạn, cung cấp search, get_preview và get_history. Trỏ client đến https://your-host/mcp với một header Authorization: Bearer chứa access token của bạn. Khi đó agent sẽ tìm kiếm trong tài liệu mà bạn thực sự đã đọc, đúng phiên bản bạn đã đọc, thay vì tìm trong các kết quả đang được public search engine xếp hạng tại thời điểm hiện tại.