diff --git a/site/hasher.html b/site/hasher.html new file mode 100644 index 0000000..a41180b --- /dev/null +++ b/site/hasher.html @@ -0,0 +1,58 @@ + + + + + +Verae WASM hasher + + + +

Local WASM hasher

+

Hash a file in this browser. Bytes never leave the device. Paste the digest into sample.html or your MCP client.

+ +
Waiting for a file…
+ + + diff --git a/site/index.html b/site/index.html index 4e3724d..a894b4e 100644 --- a/site/index.html +++ b/site/index.html @@ -4,7 +4,7 @@ Install Verae timestamping - + @@ -23,6 +23,7 @@ --gold: oklch(0.80 0.090 85); --dark: oklch(0.19 0.022 312); --ease: cubic-bezier(0.16, 1, 0.3, 1); + --ok: oklch(0.55 0.12 145); } * { box-sizing: border-box; } html { scroll-behavior: smooth; } @@ -43,7 +44,7 @@ padding: 28px 28px 0; } .brand img { height: 46px; width: auto; display: block; } - nav { display: flex; gap: 22px; font-size: 14px; font-weight: 600; } + nav { display: flex; gap: 22px; font-size: 14px; font-weight: 600; flex-wrap: wrap; } nav a { color: var(--ink-soft); text-decoration: none; } nav a:hover { color: var(--purple); } .hero { @@ -65,9 +66,9 @@ line-height: 1.05; letter-spacing: -0.03em; margin: 12px 0 18px; - max-width: 16ch; + max-width: 18ch; } - .lede { max-width: 40rem; font-size: 18px; color: var(--ink-soft); margin: 0; } + .lede { max-width: 42rem; font-size: 18px; color: var(--ink-soft); margin: 0; } .wrap { max-width: 1100px; margin: 0 auto; padding: 12px 28px 80px; } .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; margin-top: 36px; } .card { @@ -85,7 +86,7 @@ font-weight: 560; margin: 56px 0 8px; } - .section-note { color: var(--ink-soft); max-width: 42rem; margin-top: 0; } + .section-note { color: var(--ink-soft); max-width: 44rem; margin-top: 0; } pre { background: var(--dark); color: oklch(0.95 0.01 90); @@ -101,6 +102,51 @@ ol.steps { padding-left: 1.2rem; max-width: 44rem; } ol.steps li { margin: 0.55rem 0; } .gold { height: 3px; width: 72px; background: var(--gold); border: 0; margin: 28px 0; } + .detect { + background: white; + border: 1px solid var(--hair); + border-radius: 18px; + padding: 22px; + margin-top: 22px; + } + .detect .status { font-size: 15px; color: var(--ink-soft); margin: 0 0 14px; } + .detect .status strong { color: var(--ink); } + .btn-row { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; } + .btn { + display: inline-flex; + align-items: center; + gap: 8px; + background: var(--purple); + color: white; + text-decoration: none; + border: 0; + border-radius: 999px; + padding: 12px 18px; + font: inherit; + font-weight: 600; + font-size: 14px; + cursor: pointer; + } + .btn.secondary { + background: white; + color: var(--purple); + border: 1px solid var(--hair); + } + .btn:disabled { opacity: 0.5; cursor: not-allowed; } + .meta { font-size: 13px; color: var(--ink-mute); margin-top: 12px; } + .ok { color: var(--ok); font-weight: 600; } + table.artifacts { + width: 100%; + border-collapse: collapse; + margin-top: 16px; + font-size: 14px; + } + table.artifacts th, table.artifacts td { + text-align: left; + padding: 10px 8px; + border-bottom: 1px solid var(--hair); + } + table.artifacts th { color: var(--ink-mute); font-weight: 600; font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; } footer { border-top: 1px solid var(--hair); padding: 28px; @@ -119,91 +165,105 @@
Verae

Model Context Protocol

-

Install Verae timestamping.

-

Register once. The token stays in a private file on your machine, or in your assistant’s own login store. It does not go in the chat, and it does not go in the client config.

+

Hash locally. Stamp remotely.

+

Download a small verae-sha256 binary for your OS (or use WASM on mobile/browser). Digests go to the MCP server. File bytes stay on your machine.


+
+

Get the local hasher

+

No repo clone. This page detects your platform, fetches the matching published binary from /hasher/, and falls back to WASM/JS when a native build is not available.

+
+

Detecting platform…

+
+

+ +
+

All published binaries

+ + + +
TargetFileSizeSHA-256
+

Manifest: /hasher/latest.json · Source rebuild: ./scripts/publish-hasher.sh in the client repo.

+
+ +
+

Connect an MCP client

+

Point Claude, Cursor, or another MCP client at this host. You do not need to run a local server.

+
{
+  "mcpServers": {
+    "verae-timestamping": {
+      "url": "https://HOST/mcp"
+    }
+  }
+}
+

Public endpoints: https://HOST/mcp + · also mcp.veraetime.net/mcp + · mcp.georgelambert.org/mcp

+ +

Hash a file, then stamp

+
# after installing the binary as verae-sha256 on your PATH:
+DIGEST=$(verae-sha256 ./document.pdf)
+echo "$DIGEST"
+# then ask your MCP client to call tool "stamp" with { "sha256": "$DIGEST", "scope": "global" }
+# or try the browser sample:
+#   open sample.html and paste the digest
+
+
-

Register on your machine

-

This is the install for a person or a server you control. uv runs the command. You do not clone this repository.

+

Optional: register on your machine

+

For a local uvx server (or global stamps that need a VeraeTime account), register once. You still do not clone a repository.

uvx verae-mcp-timestamping-server setup
  1. Choose new to create a VeraeTime account, or existing to log in.
  2. -
  3. Enter a username and password. The command calls https://api.veraetime.net.
  4. -
  5. It writes ~/.verae/auth.properties with mode 600 and prints your username, role, and expiry. It does not print the token.
  6. -
  7. Check it later with uvx verae-mcp-timestamping-server session.
  8. +
  9. It writes ~/.verae/auth.properties with mode 600. It does not print the token.
  10. +
  11. Check later with uvx verae-mcp-timestamping-server session.
-

If you start the server before registering, it prints those same steps on its error stream and still starts. Global stamps need the file. Local stamps do not.

-
- -
-

Connect an assistant

-

Pick the environment you use. The config names the program. It does not contain the token.

Claude Desktop

macOS and Windows

-

macOS file: ~/Library/Application Support/Claude/claude_desktop_config.json. Windows file: %APPDATA%\Claude\claude_desktop_config.json. Restart Claude after saving.

+

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json. Windows: %APPDATA%\Claude\claude_desktop_config.json.

Cursor

Project or user

-

User file: ~/.cursor/mcp.json. A project file is .cursor/mcp.json in that project. Restart Cursor after saving.

+

User file: ~/.cursor/mcp.json. Project file: .cursor/mcp.json.

-

VS Code and others

-

mcp.json

-

The same JSON works for any client that reads the Model Context Protocol mcpServers map, including VS Code with an MCP extension.

+

Local uvx

+

Run on this computer

+

Use command: uvx / args: ["verae-mcp-timestamping-server"] instead of a remote URL when you want the process on your machine.

-

Run it on your computer

-

The assistant starts the server. Your login in ~/.verae/auth.properties is the one it uses.

-
{
-  "mcpServers": {
-    "verae-timestamping": {
-      "command": "uvx",
-      "args": ["verae-mcp-timestamping-server"]
-    }
-  }
-}
-

Use the public server

-

No local program. The assistant connects to this host. When per-user sign-in is on, the first connection opens a browser page at /account to create an account or log in. That token stays in the assistant’s OAuth store, not in this file.

-
{
-  "mcpServers": {
-    "verae-timestamping": {
-      "url": "https://mcp.veraetime.net/mcp"
-    }
-  }
-}
-

Where the token lives

+

Where credentials live

Your machine

~/.verae/auth.properties

-

Mode 600, owned by you. Holds the JWT, its expiry, your username, and your password so a stamp can log in again before the 24-hour token expires. Do not commit this file.

+

Mode 600. Holds the JWT for local/global stamps. Do not commit this file.

Your assistant

-

OAuth file

-

A browser login on the public server gives the assistant a VeraeTime JWT and a refresh token. The Python client stores that under ~/.verae/oauth/mcp-tokens.json, also mode 600.

+

OAuth store

+

Browser login on the public server keeps tokens in the assistant’s OAuth store, not in mcp.json.

Never

Chat or mcp.json

-

Do not paste the token into a conversation or into the client config. session shows the username and expiry if you need to confirm the login.

+

Do not paste tokens into a conversation or client config.

@@ -212,8 +272,213 @@ + diff --git a/site/sample.html b/site/sample.html index b596b3b..3a46f6f 100644 --- a/site/sample.html +++ b/site/sample.html @@ -16,10 +16,10 @@

Verae timestamping MCP sample

This page calls a Model Context Protocol (MCP) server. The three letters are MCP. The server name is verae-timestamping. It stamps a SHA-256 digest. It does not upload a file.

-

Start the server on this machine, then submit. A page on the public internet cannot reach 127.0.0.1.

+

This page defaults to the public MCP on this host. You can also point it at a local uvx server on 127.0.0.1.

VERAE_MCP_CORS=1 VERAE_MCP_TRANSPORT=streamable-http uv run verae-mcp-timestamping-server
- +