Finance Toolkit
500+ transparent financial methods calculated from raw statements, not third-party endpoints.
作者による説明(英語の原文)
Long-term memory for AI agents: bitemporal fact ledger, contradiction detection, explainability.
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
ウェブ、デスクトップ、モバイルのClaudeで使えます:
https://api.gethaki.space/mcp/ターミナルでこれを実行します
claude mcp add --transport http haki https://api.gethaki.space/mcp/プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"haki": {
"url": "https://api.gethaki.space/mcp/"
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"haki": {
"type": "http",
"url": "https://api.gethaki.space/mcp/"
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
ChatGPTがつなげるのは、インターネット上のサーバーだけです:
https://api.gethaki.space/mcp/メニューの名前は、プランや時期によって少し違うことがあります。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
このサーバーのツール一覧はまだ読み取っていません。エンドポイントは順番にチェックしています。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント GetHaki で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
まだチェックしていません。エンドポイントは順番にチェックしています
まだチェックしていません。エンドポイントは順番にチェックしています
まだチェックしていません。エンドポイントをチェックするときにツール一覧を読み取ります
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
作者のクラウドで動きます。インストール不要でインターネット経由でつながりますが、送った内容は作者のサーバーを通ります。
GitHubリポジトリの最終更新は–、最新バージョン(0.1.0)がレジストリに届いたのは2 か月前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。URLでつながるので、リモートMCPサーバーに対応したアプリ(開発者モードのChatGPTなど)でも使えます。
同じカテゴリには:Finance Toolkit, SolidInvoice, Korea Tax Calculator
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
500+ transparent financial methods calculated from raw statements, not third-party endpoints.
Create and send invoices and quotes, manage clients, and track payments in SolidInvoice.
Korean tax calculation and tax-audit judgment MCP: 96 tools with statutory citations.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
*Context with proof: every fact carries a date, a source, and a status.*
Haki gives any AI agent a memory that lasts for months — that tells current from stale — and that can prove every recollection.
Quickstart · Coded agent · Cursor · n8n · Gateway · API · gethaki.space
Today, an AI agent remembers nothing beyond a single conversation: every new session starts from scratch, re-explains context, and can apply a preference that went stale months ago with no way to tell.
Haki is an open-source (Apache-2.0), persistent memory layer, independent of whatever model or framework you use: it extracts structured facts from an agent's exchanges, keeps them current over time, and hands every new request a relevant, dated, sourced context packet. It stays entirely under your control — one docker compose up installs it, and your existing agent, model, and infrastructure don't change.
Teams building AI agents in production run into the same limits, every time:
| Symptom | Consequence |
|---|---|
| The user has to repeat information already given | Degraded experience, churn |
| The agent applies a preference that was overridden long ago | Wrong answer, broken trust |
| The entire history gets replayed into the prompt on every call | High cost and latency, useful context diluted |
| No way to explain why a piece of information was used | No traceability, no debugging |
| One customer's data can leak into another's context | Security incident |
Existing approaches (generic vector stores, conversation summaries) work in a demo but degrade after a few weeks of real usage: stale information served as current, undetected contradictions, zero explainability.
A fact ledger, not a conversation history. Haki doesn't archive raw messages to replay later: it extracts structured facts from them — preferences, constraints, decisions — each one linked back to the source event that grounds it.
Bitemporality and supersession. Every fact carries an explicit validity date and status. When information changes, the old fact is marked *superseded* — never silently deleted, never served again as current. On an unresolved contradiction, both versions are held back and flagged rather than served at random.
Systematic traceability. Every context packet injected comes with its sources, its validity dates, and a trace explaining which memories were kept, excluded, or blocked, and why. "Why did the agent use this piece of information?" has a verifiable answer in under a minute.
Prerequisites: Docker and uv. The defaults in
.env.exampleare enough to get started — no key required. For custom
configuration (a real LLM key, etc.), copy that file to
.env.
# Infrastructure (PostgreSQL 16 + pgvector, Redis 7)
docker compose up -d
uv sync
uv run alembic upgrade head
uv run uvicorn app.main:app --port 8100
If anything goes wrong,
bash scripts/doctor.shdiagnoses Docker, the
containers, Postgres,
.env, migrations, and the API in one command — read
only, no side effects, safe to re-run as often as needed.
In a second terminal, verify everything works:
uv run haki connect --api-url http://localhost:8100
uv run haki verify
haki verify runs a complete scenario in a few seconds: a preference, then a change of mind in the same conversation, then a new conversation that queries memory. It must serve the current value, keep the old one at status superseded instead of erasing it, and tie the whole thing to a trace.
haki verify — subject usr_verify_91d952a5e06f
✔ capture "Je préfère recevoir mes factures en français." thr_35bb7ecf ✔ consolidate 1 fact(s) extracted 0.2s ✔ capture "En fait, envoie-les moi en anglais plutôt, pa..." thr_35bb7ecf (same thread) ✔ consolidate 1 supersession 0.1s ✔ context NEW thread thr_3a21ef34 0.0s
recalled invoice_language = {"language": "en"} valid since 2026-08-11 hidden invoice_language = {"language": "fr"} superseded trace 7c99a8de-4905-43b4-94df-21fb66492b3b
OK — your agent remembered across conversations, and it can prove it. 0.5s
The command exits 1 if the stale value is still served, or if the old value isn't found marked as superseded: serving the right value by accident, with no link between the two facts, isn't a memory that actually updates.
Multilingual by default: local embeddings are multilingual (French,
English, Spanish, and about fifty other languages) — the demo scenario
above is captured in French on purpose, and a query in a different
language still finds it. Verified end-to-end
(
scripts/check_multilingual.py).
*Python or TypeScript developers. A few lines around your existing LLM call.*
from haki import HakiClient
from haki.runtime import build_prompt_context, capture_turn
client = HakiClient("http://localhost:8100")
packet = client.context(subject_id="usr_42", query=user_msg, project_id="prj") prompt = build_prompt_context(packet) + "\n" + system_prompt
answer = my_llm(prompt, user_msg) # your LLM and app code don't change
capture_turn(client, "usr_42", "prj", user_msg, answer)
SDK details (methods, async, errors)
capture(events, idempotency_key) — idempotent ingestion: a network retry never creates a duplicate;context(subject_id, query, project_id, budget_tokens=2000) — the ContextPacket, with trace_id;inspect(trace_id) — why these memories were chosen;timeline(subject_id, project_id), consolidate_subject(...), facts(...), consolidate(), forget(...), health();AsyncHakiClient;HakiApiError (error_type, field, status_code), HakiConnectionError.CLI: haki login (device-code sign-in, see below), haki connect (configure and test with a key in hand), haki verify (timed memory test), haki status (API health), haki mcp (Cursor packaging).
`haki login` — for a Cloud account, the hk_ key is only ever shown once, at provisioning: the terminal has no way to retrieve it again. The device-code flow (RFC 8628) closes that gap without a new secret. The CLI shows an XXXX-XXXX code and opens /cli-auth with the code already filled in (verification_uri_complete); the code stays on screen too, so it can be typed by hand from a phone. You approve it in the console, already signed in — the terminal then receives a fresh, dedicated key, not the console's own — revoking that terminal from *Keys* disconnects nothing else. The key is served exactly once, by the poll that consumes it.
Server-side, HAKI_CONSOLE_SERVICE_KEY must be configured (it's what authenticates the console against /v1/cli/device/approve). Wrong codes are rate-limited per person, not per IP: every approval arrives from the same address (the console's own backend), so a per-IP counter would be a shared bucket any single user could exhaust for everyone else.
*Same methods, same typed errors, same block — zero runtime dependency (native fetch, Node 18+).*
cd sdk/typescript && npm install && npm run build && npm test
import { HakiClient, buildPromptContext, captureTurn } from "gethaki";
const client = new HakiClient({ baseUrl: "http://localhost:8100", apiKey: "hk_..." });
const { packet } = await client.context({ subjectId: "usr_42", query: userMsg, projectId: "prj" }); const prompt = buildPromptContext(packet) + "\n" + systemPrompt; const answer = await myLlm(prompt, userMsg); await captureTurn(client, { subjectId: "usr_42", projectId: "prj", userMsg, assistantMsg: answer });
CLI haki-ts (node dist/cli.js …): connect, verify, status — same ~/.haki/config.json file as the Python CLI, the two are interchangeable. Runnable example: sdk/typescript/examples/basic-agent.mjs.
*Cursor users. One-click install, no key to copy by hand.*
uv run haki mcp # prints the deeplink, the mcp.json, and the Project Rule
.cursor/rules/haki.mdc) tells the agent when to remember and when to recall;Four tools show up in Cursor:
| Tool | Role |
|---|---|
haki_context | Recall the project's relevant context before coding |
haki_capture | Store a decision, a convention, a resolved bug |
haki_inspect | See why a memory was used |
haki_forget | Forget a piece of information |
Known, documented limit: MCP can't intercept every Cursor conversation —
the server only sees the tool calls Cursor decides to trigger. The Project
Rule tells the agent *when* to call them; real coverage is measured, never
presented as total.
*No-code builders. One template to import, three things to configure.*
Chain: Webhook → Haki Context → AI Agent → Haki Capture → Respond
Two options in integrations/n8n/:
haki-persistent-support-agent.json — importable into any n8n instance, no extra install (standard HTTP nodes);n8n-nodes-haki — visual Haki Context and Haki Capture nodes, with built-in validation.Three settings are all it takes: the Haki credential, the LLM credential, and the counterpart's identity (subject). A call with no identity is refused — a memory with no stable identity isn't reliable.
Verified against a real n8n instance (Docker): a preference stated in the
first message is recalled in the second, with its source.
*Apps already speaking the OpenAI API. Only base_url changes — memory becomes automatic.*
import openai
client = openai.OpenAI( base_url="http://localhost:8100/gateway/v1", api_key="hk_...", # Haki key default_headers={"X-Haki-Subject-Id": "usr_42"}, # who to remember ) client.chat.completions.create(model="...", messages=[...])
On every POST /gateway/v1/chat/completions call: the subject's memory is injected at the top of the system message (a … block), the call is forwarded to the configured provider (HAKI_LLM_* — the Haki key itself is never sent upstream), the exchange is then captured (conversation.turn, idempotent), and consolidation resumes in the background. The response returned is the provider's own, unchanged, plus three headers: X-Haki-Memory, `
冒頭だけを表示しています。続きはリポジトリで読めます