Stamp
The concierge MCP for agentic workflows: the small, high-frequency tools agents reach for constantly -- NTP time and clock drift, UUIDs, diffs, safe arithmetic, and tamper-evident attestation -- behind one endpoint.
A single NTP query tells you where your clock is right now. Drift history
tells you where it is going: a clock that is consistently 200 ms fast and
accelerating is a different problem from one that is stable at 200 ms
fast. get_time takes the measurement; every call appends to a local
log; get_drift reads the log and reports the trend.
Hosted endpoint (no sign-in, public):
https://stamp-mcp.terradev.cloud/mcp
PyPI: pip install stamp-mcp | License: Apache 2.0
Quick start
Remote (streamable HTTP — no install needed)
Add to your MCP client config:
{
"mcpServers": {
"stamp": {
"url": "https://stamp-mcp.terradev.cloud/mcp"
}
}
}
Local (stdio)
pip install stamp-mcp
Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"stamp": {
"command": "stamp-mcp"
}
}
}
Restart Claude Desktop, then ask it "what tools do you have?" — get_time
should appear. If it doesn't, check ~/Library/Logs/Claude/mcp*.log.
Tools
-
get_time— one NTP query: UTC time, this clock's offset in ms, network delay, stratum. Appends the sample to the drift log. Optional:server(defaulttime.cloudflare.com),timezone(IANA name for alocalfield, e.g.America/New_York). -
get_drift— analyzes the drift log: sample count, timespan, current/mean/stddev offset, drift rate in ms/day (least-squares fit), first-half vs. second-half rates, and a verdict:stable,drifting, oraccelerating. Optional:serverto filter by NTP host. -
generate_uuid— random UUIDv4s for records, sessions, and identifiers. Optional:count(1–1000, default 1). -
diff— unified diff betweentext_aandtext_b, with added/removed line counts and anidenticalflag. Optional:context(lines of context, default 3). -
calculate— safe math evaluator:+ - * / // % **, parentheses, functions (abs round min max sqrt floor ceil exp log log2 log10 pow sin cos tan), constantspi e tau inf. Parsed to an AST; only whitelisted nodes are evaluated — noeval(), no arbitrary code. Required:expression. -
attest— wrap any JSON payload in a tamper-evident record: a UUID, an NTP-verified timestamp (falls back to local clock;time_sourcesays which), and asha256over the canonical record. Required:payload. Optional:server. -
verify— recompute an attested record's hash and compare. Returnsvalidplus a reason; any modified field — payload, timestamp, id — breaks it. Required:attested.
The drift log
Every get_time call appends one JSON line to ~/.stamp/drift.jsonl
(override with STAMP_DRIFT_LOG). The file is capped at 10,000 samples.
Call get_time periodically — a cron job, a heartbeat, or just asking
Claude "check the clock" — and get_drift turns the accumulated offsets
into a trend.
HTTP transport
stamp_mcp/http_server.py serves the same dispatch logic over async HTTP
via aiohttp:
stamp-mcp-http # binds 127.0.0.1:8000
STAMP_PORT=9000 stamp-mcp-http # custom port
| Endpoint | Method | Description |
|---|---|---|
/mcp |
POST |
JSON-RPC 2.0 — single or batch; notifications → 202 |
/mcp |
GET |
SSE channel for server-to-client notifications (keep-alive) |
/ |
GET |
Service identity: name, version, endpoint map |
/health |
GET |
{"status":"ok"} for proxies and monitors |
/.well-known/oauth-protected-resource |
GET |
RFC 9728 metadata — public, no auth servers |
/.well-known/agent-card.json |
GET |
A2A agent card |
TLS is terminated by a reverse proxy. The production layout is two
containers on one AWS instance (docker-compose.yml):
stamp— aiohttp server built fromDockerfile, internal network only. Drift log persists in thestamp-datavolume.caddy— terminates HTTPS atstamp-mcp.terradev.cloud(automatic Let's Encrypt) and reverse-proxies tostamp:8000.
Concurrency is capped at 100 simultaneous POST /mcp requests via
asyncio.Semaphore; /health and / are exempt.
Self-hosting
git clone https://github.com/theoddden/Stamp-MCP.git
cd Stamp-MCP
docker compose up -d --build
Caddy handles TLS automatically once your DNS A record points at the host.
See deploy/Caddyfile and deploy/stamp-mcp.service (systemd, bare-metal
alternative).
Deployment to AWS is automated via GitHub Actions (deploy.yml) using SSM
Run Command — no inbound SSH needed.
Wire protocol
>>> {"jsonrpc":"2.0","id":1,"method":"initialize","params":{...}}
<<< {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05",...}}
>>> {"jsonrpc":"2.0","method":"notifications/initialized"}
>>> {"jsonrpc":"2.0","id":2,"method":"tools/list"}
<<< {"jsonrpc":"2.0","id":2,"result":{"tools":[...]}}
>>> {"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_time","arguments":{}}}
<<< {"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":"..."}]}}
License
Copyright 2024 theoddden. Licensed under the Apache License, Version 2.0.
DISCLAIMER: Stamp queries public NTP infrastructure (Cloudflare, stratum 3) and is suitable for general agentic workflows. It is not intended for use cases requiring certified atomic precision, legal timestamp authority, or regulated audit trails. Use in production systems is at the implementer's risk.
Metadata
Release files for stamp-mcp 0.5.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| stamp_mcp-0.5.7.tar.gz | 24.2 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| stamp_mcp-0.5.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 47.8 kB
Release files / stamp_mcp-0.5.7.tar.gz
| Download URL | stamp_mcp-0.5.7.tar.gz |
|---|---|
| Size | 24.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b2f531373b29e014983b941091304b54f3e8645b9aaac7f31e2336a0448b8c16
|
|
BLAKE2b-256 checksum How to use checksums |
c7b7b461ef96e54764636c8ce95fa9c5cec83147f7b1aab73d986ab912b3f96d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / stamp_mcp-0.5.7-py3-none-any.whl
| Download URL | stamp_mcp-0.5.7-py3-none-any.whl |
|---|---|
| Size | 23.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a9c2811f8cd96ce60abac77548637e734d10311a56118bc67ce5fee538921dc2
|
|
BLAKE2b-256 checksum How to use checksums |
afd4e3bde2894be88362df48ec75648bb4afb0816e0bc12f9c242d11653e8c08
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Security for stamp-mcp 0.5.7
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.