Graviti

ai.thesingulariti由 thesingulariti.ai 發布官方發布者v0.2.0更新於 Oct 24, 2026

Verified brand claims with receipts for agent commerce. Ranking is never paid; the engine is open.

已驗證Streamable HTTP可網頁執行安全與監控資料與分析商業與電商

概覽

AI 產生的概覽

Graviti 是託管的 MCP 伺服器,回傳依契合度排序的品牌推薦,並附上可溯源的已驗證聲明與公開的簽章完整性帳本。

可以做什麼
將買家問題媒合為排序後的品牌推薦,索引外的問題會明確拒絕而非猜測,並讀取某品牌的結構化已驗證聲明,含來源連結、時效與驗證狀態。以表格形式比較某品類內所有品牌的已揭露屬性,並標註每筆的揭露品質。讀取印章變更與確認事件的公開問責日誌,以及僅可追加、雜湊鏈結、帶簽章的索引版本帳本。取得品牌與品類領先者之間差距的報告,並向日誌追加一筆歸因轉換事件。
適用情境
適合助理需要根據帶來源與驗證狀態的聲明來回答產品或品牌推薦問題時使用,也適合需要稽核排名如何產生、付款是否影響排名的人。同樣適用於品牌方分析品類差距與揭露品質。
執行需求
遠端 Streamable HTTP 端點,無需驗證與帳號;或透過 npx 以 stdio 執行 graviti-mcp npm 套件,啟動時會抓取最新發布的索引並對照簽章帳本驗證。本機方式需要 Node.js;README 中的驗證腳本需要 Node 20 以上,或 curl、jq 與 sha256sum。
安裝前請注意
品牌付費接受驗證,也可付費加快重新評估,但伺服器聲明付款絕不影響排名;每個回應都會揭露驗證狀態。report_conversion 會向日誌追加事件,README 稱其為展示用雛形,不涉及金流,是否持久化取決於傳輸方式。推薦連結帶有出站歸因權杖,標示推薦來源介面而非使用者。

安裝

在 SourceWeft 中

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

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/ai.thesingulariti%2Fgraviti/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "graviti": {
      "type": "http",
      "url": "https://graviti.thesingulariti.ai/api/mcp"
    }
  }
}

README

graviti-engine

The deterministic scoring engine behind Graviti — trust infrastructure for agent-mediated commerce, built by Singulariti. This repository exists so the site's central claim ("scoring is open to audit") is checkable, not just stated: src/engine.ts here is the exact module that ranks every recommendation in production — the MCP servers, the web console, and the public endpoints all import this one file. There is no private ranking path.

Use it from any agent — under a minute

Graviti speaks MCP on two paths; both serve the same seven tools (match_intent, get_verified_claims, category_landscape, get_accountability_log, get_ledger, get_gap_report, report_conversion) through this exact engine.

Remote (fastest) — hosted Streamable HTTP endpoint, no auth, no account:

json
{ "mcpServers": { "graviti": { "url": "https://graviti.thesingulariti.ai/api/mcp" } } }

Local — the graviti-mcp npm package over stdio:

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

The package ships an index snapshot and, on startup, pulls the latest published index and verifies it against the signed ledger — the pinned key, two independent ledger paths, and the replay guard are the same procedure as scripts/verify-payload.mjs below. A tampered or replayed payload is never used. (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; wiring for other clients at graviti.thesingulariti.ai/use-graviti.)

The two laws

  1. Verification is paid. Ranking is never paid. Brands pay for continuous independent auditing of their claims. Verification status carries zero weight in ranking — read the fit-score construction in matchIntent() and confirm no payment signal enters it.
  2. Payment buys speed, never outcome. A brand can pay to fast-track a re-evaluation; payment compresses the clock, never the verdict.

The only score adjustments tied to a brand's standing are the fixed, disclosed lifecycle penalties (LIFECYCLE_PENALTY: flagged −0.05, degraded −0.15) — driven by monitored quality signals, never by payment status — and revoked brands are excluded from scoring entirely.

What you can verify by reading this code

  • Scoring is deterministic. Pure functions over a brand index — no I/O, no network, no randomness, no learned parameters. The engine's only inputs are the index, the question text, and an optional intent profile. Same inputs, same scores, every time.
  • Conversion data never enters scoring. The engine has no conversion input — grep this file for anything conversion-shaped and you'll find nothing. Attributed-conversion events exist in the private transport layer purely as billing records (pay-on-real-acquisition); they are structurally incapable of reaching a fit score because this module never sees them.
  • Scores are reproducible from public data. The full index this engine runs over in production is public. Point the engine at it and you reproduce production scores exactly:
  • Every payload carries structural disclosure. See disclosure(): rank_influenced_by_payment: false, who paid, who didn't, and what payment buys — machine-readable, on every response.
  • Out-of-scope questions get a refusal, never a guess. See the in_index: false branch of matchIntent().

Run it

bash
npm installnpm run demo -- "best magnesium supplement"npm run demo -- "cheapest cold plunge with a chiller"npm run demo -- "best magnesium supplement" --json     # the full machine payload agents receive

The demo runs the engine over data/sample-index.json, a small real slice of the public index (five categories, ~100 brands, with claims, provenance URLs, and the accountability log). For the complete picture, fetch index-full.json and substitute it — the engine takes any BrandIndex.

Run the canaries

bash
npm run canary

Graviti runs canary-based drift detection: subjects of known ground truth are pushed through the system on every production build (Panel A — golden routing queries, structural invariants like no NaN score anywhere and catalog-tier brands never rank, and adversarial cases where the famous answer must NOT win) and through the audit crawler on every cycle (Panel B — three provenance pages the site controls: one steady, one deliberately drifted, one deliberately gone). A Panel A divergence fails the build; a Panel B misread means the sensor itself is broken and that crawl cycle refreshes no real claims. The two panels are independently maintained so neither becomes the other's ground truth.

scripts/canary-panel-a.ts is the public subset of Panel A — the cases the sample index supports, over the exact engine this repository publishes, so you can run the same canaries the build runs with zero secrets. Live status for both panels is published in the canaries block of pulse.json (human-readable at /pulse).

Verify the ledger

The index's version history is a hash chain: each entry commits to the SHA-256 of the canonical full-index content and the previous entry's hash, is Ed25519-signed against the published public key (data/public-key.pem, also served at /public-key.pem), and is anchored to Bitcoin via OpenTimestamps. Rewriting any historical entry breaks every hash after it — even Graviti cannot edit the record.

bash
npm run verify:ledger           # verifies the committed ledger snapshot, then checks it against the live indexnpm run verify:ledger -- --live # fetches and verifies the current live ledger instead

The script needs no secrets and no Graviti-run infrastructure: it recomputes every entry hash, walks the chain back to genesis, and checks every signature against the public key. Bitcoin anchors can be independently replayed with the open-source OpenTimestamps client against proofs at /ots/v<N>.ots — instructions in llms.txt.

Verify what you received — transport integrity

The ledger proves what was published. It cannot see the pipe: TLS-terminating proxies, CDNs, caches, and load balancers sit between Graviti's origin and your process, and any of them could alter a payload with no ledger entry capturing the delta. From ledger v25, every entry's signed core pins a sha256 manifest of every published payload (files.artifacts), so the check moves to your side of the pipe. Verify before trust:

bash
npm run verify:payload                                             # /index-full.jsonnpm run verify:payload -- /index.json /data/categories/magnesium-supplements.json /llms.txt

scripts/verify-payload.mjs is dependency-free (Node ≥ 20) and exits nonzero on any failure. It:

  1. fetches the ledger from two independent paths — this repo's snapshot on raw.githubusercontent.com and the origin's /ledger.json — verifies both chains, and cross-checks the heads (a fork or an origin serving an older ledger than the public mirror fails loudly);
  2. verifies every Ed25519 signature against the pinned signing key embedded in the script — the served /public-key.pem is cross-checked against the pin and a mismatch is a failure, never a source of trust;
  3. recomputes the sha256 of the payload you actually received and compares it to the head entry's signed manifest;
  4. guards against replay: a payload that matches an older entry's manifest instead of the head is stale-but-validly-signed — reported as its own failure, because a replayed yesterday is the subtle attack.

No Node? The core check is two commands with curl, jq, and sha256sum — expected hash from the mirror snapshot (independent path), actual hash from the bytes that reached you:

bash
curl -s https://raw.githubusercontent.com/sclaytonmyosin/graviti-engine/main/data/ledger.json \  | jq -r '.entries[-1].files.artifacts["/index-full.json"]'curl -s https://graviti.thesingulariti.ai/index-full.json \  | jq -cjS 'del(.generated_at, .integrity)' | sha256sum

The two hashes must match. (JSON payloads are hashed in canonical form — recursively sorted keys, no whitespace — after deleting the two volatile envelope fields generated_at and integrity, which carry the build timestamp and the pinning entry's own hash and so cannot be inside the pinned content. /llms.txt is hashed as exact bytes, no jq step.) For the full guarantee, also confirm the mirror and origin ledgers agree and the signature chain verifies — that's steps 1–2 above, or npm run verify:ledger.

The boundary, honestly: a passing check proves the bytes that reached the edge of your process match Graviti's signed, Bitcoin-anchored record. Nothing cryptographic reaches inside your runtime or a model's context window after verification passes — if your own stack mutates the data afterwards, no publisher-side mechanism can see it. Verify as close to the point of use as you can; the last hop is yours.

Verify Graviti traffic — outbound attribution (for brands)

Every recommendation link Graviti produces to a brand's own site carries deterministic UTMs (utm_source=graviti, utm_medium=<surface: agent|console|scan|landscape|report>, utm_campaign=<category>, utm_content=<brand>) plus a signed gvt token, so the brand on the receiving end can prove the referral came from Graviti instead of trusting a spoofable UTM string. The token (gvt1.<surface>.<category>.<brand>.<YYYYMMDD>.<sig>) is Ed25519-signed with the same key that signs the ledger, and identifies the recommendation surface, never the user — no user identifiers, no click IDs, no per-click values. Full spec: docs/ATTRIBUTION.md.

bash
node scripts/verify-attribution.mjs 'gvt1.agent.magnesium-supplements.bioptimizers.20260829.<sig>'# or paste the full landing URL — the script extracts the gvt parameter

Dependency-free (Node ≥ 20), pinned key, exit 0 only on a valid signature. The equivalent openssl commands are in the spec.

Sync provenance

src/engine.ts, scripts/verify-ledger.mjs (modulo the live-fetch adaptation noted in its header), data/ledger.json, and data/public-key.pem mirror the private Graviti monorepo at commit cf24943 (2026-08-26). The engine file is verbatim — re-syncing is a file copy plus an update to this line, and it now happens automatically with every ledger snapshot sync. This sync carries the rubric-pinning release: from ledger v26 every entry's signed core carries a rubric field — the sha256 and git blob sha1 of the exact committed src/engine.ts that scored every ranking published under that entry, plus the pinning private-repo commit and this repository's URL. That makes the sync provenance checkable instead of stated:

bash
# The engine in this repo must hash to exactly what the signed ledger head pins:git hash-object src/engine.tscurl -s https://graviti.thesingulariti.ai/ledger.json | jq -r '.entries[-1].rubric.engine_git_blob_sha1'# — the two must match byte for byte. Equivalently, with no git:sha256sum src/engine.ts   # must equal .entries[-1].rubric.engine_sha256

The blob hash is computed by git hash-object over the raw committed file bytes (no normalization), so any checkout of this mirror — or of the private repo at the pinned commit — reproduces it. A scoring change is therefore a public, diffable event: the ledger entry that ships it pins the new hash, and this file's history shows the diff. If this repo's engine ever fails that check, the mirror is out of sync (or you're comparing against a ledger newer than your checkout) — npm run verify:ledger performs the same cross-check and says which. This release also ships the claim-decay classes: the per-claim freshness policy (CLAIM_DECAY_CLASSES / CLAIM_DECAY_RULES in the engine — fast 45d, medium 120d, slow 365d, static) under which a claim past its disclosed window is marked "stale — pending re-verification" on every payload and counts at half weight where claim depth feeds scoring — visibly degraded, never zeroed, because stale is not false.

Layout

src/engine.ts            the engine — types, laws, scoring, disclosure (verbatim production module)data/sample-index.json   real slice of the public index so the demo runs offlinedata/ledger.json         committed snapshot of the public integrity ledgerdata/public-key.pem      Ed25519 public key the ledger signatures verify againstdemo/run.ts              CLI demo — question in, ranked disclosure-carrying answer outscripts/verify-ledger.mjs  no-secrets ledger verification (chain, signatures, live index hash)scripts/verify-payload.mjs client-side transport-integrity check — pinned key, two ledger paths, replay guardsrc/attribution.ts       shared outbound-attribution module (UTM scheme, gvt token format, pinned key)scripts/verify-attribution.mjs  brand-side gvt token verifier — prove a referral came from Gravitidocs/ATTRIBUTION.md      the attribution spec: scheme, token format, signing model, privacy stance

License

Apache-2.0 — Copyright 2026 Singulariti.

來源:README.md,提交 643ee4d

工具

7

match_intent

Match buyer intent to brands

Takes a natural-language buyer question plus optional intent profile; returns recommendations ranked purely by fit score. Verification status is disclosed but never affects rank. Questions outside the verified index return an explicit out-of-scope result (in_index: false), never a guess. Brands without captured evidence (catalog_only) are returned in in_landscape_not_evidenced — listed, never scored, never recommended. Each recommendation carries the brand's site link twice: site_url (raw) and attributed_url (tagged utm_source=graviti + a signed gvt token, so the brand can verify the referral — surface-level only, no user data). Prefer attributed_url when linking. Where the brand publishes a discount code/promotion on its own pages, the entry carries an offers block (code, terms, verbatim-quote receipt, 14-day re-check window) — disclosure only: offers NEVER affect ranking, and a better deal never outranks a better fit.

輸入參數question必填intent_profile

get_verified_claims

Get claims with provenance for a brand

Structured claims for one brand: provenance URLs, freshness timestamps, corroboration counts, and verification status (verified means the brand pays for auditing — always disclosed). Where captured, includes the specifications block (ingredient/spec disclosure with per-fact provenance) and its info_quality score — a 0–100 measure of disclosure completeness that never influences ranking. Graviti does not assess efficacy or clinical outcomes (not_assessed fence in every block). Claims with confirmation_status 'awaiting_brand_confirmation' are pending the brand's response to a re-verification ask — treat them as unconfirmed, not as violations. Where captured, an offers block lists the brand's published discount codes with receipts and full status history (active / expired / failed_verification) — disclosure only, never a ranking input.

輸入參數brand必填

category_landscape

Category comparison table

Comparison-table view of every brand in a category across disclosed attributes, with verification status marked per entry. Entries with captured ingredient/spec data also carry info_quality (0–100 disclosure completeness — transparency, never a rank factor; absent means not yet assessed, not zero). Every row carries evidence_state (audited / sourced / catalog_only); catalog_only rows are landscape presence only — never ranked or recommended. Rows include site_url and attributed_url (utm_source=graviti + signed gvt token — surface-level referral attribution, no user data); prefer attributed_url when linking. Rows with a published, receipt-backed discount code carry an offers array — disclosure only, never a ranking input.

輸入參數category

get_accountability_log

Public accountability log

Public, machine-readable log of every seal lifecycle change: flags, degradations, revocations, and restorations, with dates and reasons — plus confirmation-loop events (event: confirmation_request / confirmation_resolved), where the audit asked a brand to confirm a claim it couldn't re-verify: a visible ask, never a penalty. Also logged: claim_removed (a claim struck from a record, reason public), gap_report_delivered (a paid-tier report delivered to a brand, payment status disclosed — findings and rank never affected), and roster events (brand_added with lane/source, brand_removed, brand_declined, brand_skipped — every future change to who is in the index lands here per brand, reason public). The seal can be lost — a pulled seal is the loudest proof it means something. Payment can fast-track a re-evaluation; it can never change what it finds.

無需輸入參數。

get_ledger

Integrity ledger (hash-chained, signed, Bitcoin-anchored)

Append-only version history of the index: each entry commits to the SHA-256 of the canonical index content and the previous entry's hash (rewriting history breaks every hash after it), is Ed25519-signed, and is anchored to Bitcoin via OpenTimestamps. Returns entries plus independent verification instructions. Even Graviti cannot rewrite the record.

無需輸入參數。

get_gap_report

Brand gap report (brand intelligence)

What stands between a brand and top-of-category: attribute gaps vs the category leader, open flags, cohort blind spots per buyer-intent voice, and the ingredient/spec disclosure dimension — the brand's info_quality score with the exact publishable fixes that would raise it (publishing more truth, not paying Graviti). Demo of the paid brand-intelligence product — computed deterministically from the index; in production also draws on consented, compensated cohort signals (profiles never leave the user's agent). Catalog-only brands (no captured claims) receive an insufficient-evidence report instead of ranks.

輸入參數brand必填

report_conversion

Report an attributed conversion (demo stub)

Appends one attributed-transaction event to a log — the demo stub of the pay-on-real-acquisition loop. It moves no money, calls no external service, and never deletes or overwrites anything; the response states where (and whether) the event was persisted on this transport. Payment only ever flows on real transactions, never on impressions or rank. Optionally pass the gvt attribution token from the recommendation link that led to the purchase: it is verified against the published Ed25519 key and recorded with the event as verifiable provenance of the originating recommendation. Optionally pass offer_code if the buyer used a published code from the index's offers block, so deal-driven conversions are attributable — recorded as reported, never a rank input.

輸入參數gvtbrand_id必填offer_codeagent_platform必填conversation_id必填order_value_usd必填

版本歷史

1
  1. v0.2.0最新Sep 16, 2026

評分

已滿足適用檢查項的 100%

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

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分