Server definition
- Hash
- sha256:9e0cd607eced27919d5264c8490c7adb6f9f590bf533e1e5708b7aaa267207f4
- What it is
- What a remote MCP server returned when asked what it offers: 9 tools
The blob, as servednamed by its sha256
{
"instructions": "Give an AI agent a durable identity and a place to anchor what it knows, as records on a public blockchain that no single vendor owns or can switch off. Read tools (node_status, read_record, list_records, whoami) are open to everyone — no sign-in, and so is send_feedback: when something fails or is unclear, tell the operator in up to 1000 characters. Write tools (register_identity, store_memory, store_memory_batch, transfer_records) require a GitHub sign-in via OAuth, which your MCP client performs, from a GitHub account at least 30 days old; on the FREE tier writes are limited per minute and per day. Typical flow: whoami → register_identity(address) → store_memory(hash) → read_record(name); in a later session, list_records finds what you anchored before. A write reads back as `pending` and becomes `confirmed` after the next block (about 8 minutes on average lately). The substrate is Emercoin, running since 2013 — named so that any record here can also be checked independently in a public block explorer, without trusting this service.",
"tools": [
{
"description": "List every record under one GitHub id — its identity record `ai:gh:<id>` and\nall its memories `ai:gh:<id>:mem:<hash>` — newest first, with each memory's\ncontent hash and metadata. This is how an agent starting a fresh session\nfinds what it anchored before: `read_record` needs the full name, hash\nincluded, and this is where the hashes come from. Read-only, no sign-in\nneeded to list any id; omit `github_id` to list your own when signed in.\n\nWhat comes back is the chain's view: confirmed records only (a write still in\nthe mempool shows up after its block), expired ones included and flagged\n`expired` — their names can be taken by someone else, so do not treat them\nas yours. Only fingerprints and metadata live here; the content itself stays\nwherever you stored it. Results are cached for about a minute, so a record\nconfirmed seconds ago may take that long to appear.",
"inputSchema": {
"properties": {
"github_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Numeric GitHub id whose records to list. Omit it to list your own (needs a signed-in session; `whoami` shows the id).",
"title": "Github Id"
},
"limit": {
"default": 50,
"description": "Records per page, 1–200.",
"maximum": 200,
"minimum": 1,
"title": "Limit",
"type": "integer"
},
"offset": {
"default": 0,
"description": "Where the page starts; use `next_offset` from the previous page.",
"minimum": 0,
"title": "Offset",
"type": "integer"
}
},
"title": "list_recordsArguments",
"type": "object"
},
"name": "list_records",
"outputSchema": {
"$defs": {
"RecordEntry": {
"description": "One record under a GitHub id. `kind` is identity, memory or other;\n`content_hash` is set for memories, `address` for the identity record.",
"properties": {
"address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Address"
},
"content_hash": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Content Hash"
},
"expired": {
"title": "Expired",
"type": "boolean"
},
"expires_in": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Expires In"
},
"kind": {
"title": "Kind",
"type": "string"
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Metadata"
},
"name": {
"title": "Name",
"type": "string"
},
"registered_at": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Registered At"
}
},
"title": "RecordEntry",
"type": "object"
}
},
"properties": {
"github_id": {
"title": "Github Id",
"type": "integer"
},
"next_offset": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Next Offset"
},
"offset": {
"title": "Offset",
"type": "integer"
},
"records": {
"items": {
"$ref": "#/$defs/RecordEntry"
},
"title": "Records",
"type": "array"
},
"total": {
"title": "Total",
"type": "integer"
}
},
"required": [
"github_id",
"total",
"offset",
"next_offset",
"records"
],
"title": "RecordList",
"type": "object"
}
},
{
"description": "Check that the chain node behind this service is healthy and fully synced:\nits version, block height, header height, peer connections and sync state.\nIt is an Emercoin node. Read-only, no sign-in required, no parameters.\n\n`synced` is not a comparison of the two heights — it is true once the node's\nverification progress passes 0.9999, so it can still be false while `blocks`\nand `headers` already match. Trust that field, not the arithmetic. While it is\nfalse, a `read_record` may reflect an older state of the chain; writes still\nwork, they simply confirm later.\n\nAlso the way to make sense of expiry: `expires_in` on a record is denominated\nin blocks, and this tool reports the current height, so the two together are\nthe only authoritative answer to when something lapses. A term is bought in\ndays and charged at a flat 175 blocks each; the chain has been producing about\n171 a day lately (8.4 min/block over the 103 days to 2026-09-22), so a term is\nclose to its nominal length right now — but that rate drifts, which is why you\nshould read the blocks rather than convert to days.",
"inputSchema": {
"properties": {},
"title": "node_statusArguments",
"type": "object"
},
"name": "node_status",
"outputSchema": {
"properties": {
"blocks": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Blocks"
},
"connections": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Connections"
},
"headers": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Headers"
},
"synced": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Synced"
},
"verificationprogress": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Verificationprogress"
},
"version": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Version"
}
},
"title": "NodeStatus",
"type": "object"
}
},
{
"description": "Read one on-chain record by its full name — an\nagent's identity (`ai:gh:<github_id>`) or a memory\n(`ai:gh:<github_id>:mem:<hash>`) written by `register_identity` / `store_memory`.\nRecords live in Emercoin's Name-Value Storage, so anyone can verify one in a\npublic block explorer as well as here.\nReturns the confirmed on-chain record, or a `pending` one still in the mempool —\nthe `status` field ('confirmed' | 'pending') distinguishes them. A name is only\nheld for a limited term, so check `expired` (and `expires_in`, in blocks) before\ntrusting a record: a lapsed name still reads back as 'confirmed' but can be\nre-registered by anyone. Read-only, no sign-in required; use `whoami` to find\nyour own github_id. A name that has never been written is an error, not an\nempty record — handle the failure, do not test the fields for null.\n`name` is the full NVS name and is capped at 512 bytes by the chain.",
"inputSchema": {
"properties": {
"name": {
"description": "Full NVS record name to read. Identity records are 'ai:gh:<github_id>' (e.g. 'ai:gh:3772563'); memory records are 'ai:gh:<github_id>:mem:<sha256-hex>'. Any existing NVS name works.",
"title": "Name",
"type": "string"
}
},
"required": [
"name"
],
"title": "read_recordArguments",
"type": "object"
},
"name": "read_record",
"outputSchema": {
"properties": {
"address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Address"
},
"address_is_mine": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Address Is Mine"
},
"days_added": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Days Added"
},
"expired": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Expired"
},
"expires_at": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Expires At"
},
"expires_in": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Expires In"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Name"
},
"operation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Operation"
},
"pending": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"title": "Pending"
},
"pending_update": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Pending Update"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"time": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Time"
},
"txid": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Txid"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Value"
}
},
"title": "NvsRecord",
"type": "object"
}
},
{
"description": "Create or rotate your on-chain identity record `ai:gh:<github_id>`, binding an\nEmercoin address to your GitHub identity. Requires a signed-in session (OAuth)\nand counts against the FREE-tier write limits (see `whoami`). Run `whoami` first to\nconfirm you are signed in; anchor memories under this identity afterwards with\n`store_memory`. Writes one NVS transaction paid by the gateway (you need no EMC);\nthe record reads back as `pending` at once and `confirmed` after the next block\n(about 8 minutes on average lately). Idempotent — calling again rebinds the address, and\n`metadata` is replaced rather than merged.\n\nLimits worth knowing before you call: `metadata` is stored verbatim in the\nrecord value alongside your github id, login and address, and the whole value\nmust stay under 20 KiB — the chain rejects more. Every 128 bytes of name plus\nvalue adds about 0.0001 EMC to the fee the gateway pays for you. The value is\nwritten to a public chain exactly as given and cannot be deleted, so put\nnothing private in it. `address` is not parsed or checked here — any string is\naccepted, because control is proven later by signing a challenge at login, so\na typo surfaces then rather than now. Returns the record name and the\ntransaction id.",
"inputSchema": {
"properties": {
"address": {
"description": "Emercoin address to bind to your GitHub identity, e.g. 'EVfAn...'. It is the anchor for later signature login — you must control its key (control is proven when you sign a challenge at login, not here).",
"title": "Address",
"type": "string"
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional JSON object stored verbatim in the identity record, e.g. {\"agent\": \"my-bot\", \"url\": \"https://...\"}. Omit if unused.",
"title": "Metadata"
}
},
"required": [
"address"
],
"title": "register_identityArguments",
"type": "object"
},
"name": "register_identity",
"outputSchema": {
"$defs": {
"Quota": {
"description": "Writes this account has left on its tier. `writes_open_on` (a UTC date)\nappears only while the GitHub account is too new to write.",
"properties": {
"writes_left_this_minute": {
"title": "Writes Left This Minute",
"type": "integer"
},
"writes_left_today": {
"title": "Writes Left Today",
"type": "integer"
},
"writes_open_on": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Writes Open On"
}
},
"title": "Quota",
"type": "object"
}
},
"properties": {
"name": {
"title": "Name",
"type": "string"
},
"quota": {
"$ref": "#/$defs/Quota"
},
"txid": {
"title": "Txid",
"type": "string"
}
},
"required": [
"name",
"txid",
"quota"
],
"title": "WriteResult",
"type": "object"
}
},
{
"description": "Tell the people running this service that something went wrong or is unclear —\nan error you cannot explain, a result that looks wrong, documentation that\nmisled you, a tool you needed and did not find. Open to everyone; no sign-in.\nUp to 1000 characters, a few messages per day. A person reads them over the\nfollowing days; there is no automatic reply, so do not wait for one. If you are\nsigned in, your GitHub id is kept with the message; nothing else about you is.\nEvery refusal from this service points here.",
"inputSchema": {
"properties": {
"error_code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The `error` code you received, if this is about one, e.g. 'not_found'.",
"title": "Error Code"
},
"message": {
"description": "Up to 1000 characters: what you tried, what came back, what you expected. No secrets — a person reads this.",
"maxLength": 1000,
"title": "Message",
"type": "string"
},
"tool": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The tool the message is about, e.g. 'read_record'.",
"title": "Tool"
}
},
"required": [
"message"
],
"title": "send_feedbackArguments",
"type": "object"
},
"name": "send_feedback",
"outputSchema": {
"properties": {
"id": {
"title": "Id",
"type": "string"
},
"note": {
"title": "Note",
"type": "string"
},
"received": {
"title": "Received",
"type": "boolean"
}
},
"required": [
"received",
"id",
"note"
],
"title": "FeedbackReceipt",
"type": "object"
}
},
{
"description": "Anchor a fingerprint of a memory or artifact on-chain as the NVS record\n`ai:gh:<github_id>:mem:<content_hash>`. Only the hash and your metadata are\nstored — never the content, which you keep wherever you like (a file, a\ndatabase, IPFS). What you get is a tamper-evident, timestamped proof that\ncontent with this hash existed, which anyone can verify later; `list_records`\nfinds your earlier ones again. Requires a signed-in session (OAuth) and counts against the\nFREE-tier write limits (see `whoami`). Writes one NVS transaction paid by the gateway;\nreads back `pending` at once, `confirmed` after the next block (about 8 minutes on average lately). Not\nidempotent — each distinct hash is a new record. Register your identity first\n— nothing enforces it, the write succeeds either way, but a memory under an\nunregistered id anchors to nobody and proves correspondingly little.\n\nWriting a hash you already anchored renews that record: its term is extended\n(terms add up), and its metadata is replaced by what you pass now — so pass\nthe old metadata again if you want to keep it. That is the only renewal there\nis; a record left alone lapses after its term (see `expires_in`).\n\nLimits worth knowing before you call: `content_hash` becomes part of the\nrecord *name*, `ai:gh:<github_id>:mem:<hash>`, so it must look like a digest:\n32–128 characters of letters, digits, '_' or '-' (hex of any common algorithm,\nor an IPFS CID); anything else is refused with `invalid_hash` before any quota\nis spent. Beyond that shape it is never verified: nothing checks that it is\nthe hash of anything, so a wrong digest anchors happily and proves nothing. `metadata` goes verbatim\ninto the record value, which must stay under 20 KiB, is public and permanent.\nReturns the record name and the transaction id.",
"inputSchema": {
"properties": {
"content_hash": {
"description": "Hash of the artifact/memory, e.g. a SHA-256 hex digest. It becomes the record's ':mem:<hash>' suffix; the content itself stays off-chain (e.g. IPFS) — only this fingerprint is anchored.",
"title": "Content Hash",
"type": "string"
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional JSON object stored with the record (note, source, tags, …). Omit if unused.",
"title": "Metadata"
}
},
"required": [
"content_hash"
],
"title": "store_memoryArguments",
"type": "object"
},
"name": "store_memory",
"outputSchema": {
"$defs": {
"Quota": {
"description": "Writes this account has left on its tier. `writes_open_on` (a UTC date)\nappears only while the GitHub account is too new to write.",
"properties": {
"writes_left_this_minute": {
"title": "Writes Left This Minute",
"type": "integer"
},
"writes_left_today": {
"title": "Writes Left Today",
"type": "integer"
},
"writes_open_on": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Writes Open On"
}
},
"title": "Quota",
"type": "object"
}
},
"properties": {
"name": {
"title": "Name",
"type": "string"
},
"quota": {
"$ref": "#/$defs/Quota"
},
"txid": {
"title": "Txid",
"type": "string"
}
},
"required": [
"name",
"txid",
"quota"
],
"title": "WriteResult",
"type": "object"
}
},
{
"description": "Anchor many fingerprints in ONE on-chain transaction — the way to record a\nsession's worth of artifacts without spending a write per minute on each.\nEach item becomes `ai:gh:<github_id>:mem:<content_hash>`, exactly as with\n`store_memory`: only hashes and metadata, never content. All or nothing: if\nany item is refused (a malformed hash, say), nothing is written.\n\nRequires a signed-in session. A batch of N counts as N writes against the\nFREE-tier limits (10 per minute, 100 per 24 hours), so at most 10 items fit\nin one call on a fresh minute; the result says how many writes are left.\nOne transaction id comes back for the whole batch; each name reads back\n`pending` at once and `confirmed` after the next block.",
"inputSchema": {
"$defs": {
"MemoryItem": {
"properties": {
"content_hash": {
"title": "Content Hash",
"type": "string"
},
"metadata": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"title": "Metadata"
}
},
"title": "MemoryItem",
"type": "object"
}
},
"properties": {
"records": {
"description": "1–100 items, each {\"content_hash\": \"<digest>\", \"metadata\": {...}}; metadata is optional. Same rules as store_memory for each item.",
"items": {
"$ref": "#/$defs/MemoryItem"
},
"maxItems": 100,
"minItems": 1,
"title": "Records",
"type": "array"
}
},
"required": [
"records"
],
"title": "store_memory_batchArguments",
"type": "object"
},
"name": "store_memory_batch",
"outputSchema": {
"$defs": {
"Quota": {
"description": "Writes this account has left on its tier. `writes_open_on` (a UTC date)\nappears only while the GitHub account is too new to write.",
"properties": {
"writes_left_this_minute": {
"title": "Writes Left This Minute",
"type": "integer"
},
"writes_left_today": {
"title": "Writes Left Today",
"type": "integer"
},
"writes_open_on": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Writes Open On"
}
},
"title": "Quota",
"type": "object"
}
},
"properties": {
"count": {
"title": "Count",
"type": "integer"
},
"names": {
"items": {
"type": "string"
},
"title": "Names",
"type": "array"
},
"quota": {
"$ref": "#/$defs/Quota"
},
"txid": {
"title": "Txid",
"type": "string"
}
},
"required": [
"txid",
"count",
"names",
"quota"
],
"title": "BatchWriteResult",
"type": "object"
}
},
{
"description": "Hand your records over from the gateway's wallet to an address you choose,\nin one transaction. IRREVERSIBLE: once the block confirms, the gateway can no\nlonger change, renew or return them — nor can anyone else but the holder of\n`to_address`. Values are carried over unchanged, and each record gets about a\ncentury added to its term, since the gateway will not be able to renew it.\n\nWhy you might: with an address whose key you hold, the records are really\nyours — you can prove control by signing, and payments sent to your identity\nname reach you rather than the gateway. Changing a record afterwards needs your\nown Emercoin node and its fees. With an address no one holds a key to, the\nrecords are sealed: provably unchangeable by anyone until the term ends. If you\nonly want proof that something existed at a given time, do not transfer — a\nrecord held by the gateway is already dated.\n\nOnly records under your own identity (`ai:gh:<github_id>` and its `:mem:`\nrecords) can be moved, and only once they are confirmed. Requires a signed-in\nsession; each record counts as one write against the FREE-tier limits. After\na transfer, register_identity and re-storing a moved hash fail with\n`not_held`; new memories are held by the gateway again.\n\nChanging a record costs a network fee in EMC. If you hold the key and have no\nEMC, set `fee_grant`: the gateway then also sends 0.01 EMC (about fifty value\nupdates) to `to_address` in a separate transaction — once per GitHub account,\nwithin a daily budget. If it is not available the call is refused before\nanything moves (`fee_grant_used`, `fee_grant_unavailable`), so you can decide\nto transfer without it. Do not ask for it with an address no one holds a key\nto: nobody could spend it. Returns the transaction id, the names moved, the\nfee funds if sent, and a plain statement of what changes.",
"inputSchema": {
"properties": {
"everything": {
"default": false,
"description": "Transfer your identity and every live memory at once (up to 100). Use instead of `names`.",
"title": "Everything",
"type": "boolean"
},
"fee_grant": {
"default": false,
"description": "Also send a small amount of EMC to `to_address` to pay network fees for changing these records later from your own node. Once per account; refused before anything moves if it is not available.",
"title": "Fee Grant",
"type": "boolean"
},
"irreversible": {
"description": "Must be true. Confirms you understand the gateway can never change, renew or return these records afterwards.",
"title": "Irreversible",
"type": "boolean"
},
"names": {
"anyOf": [
{
"items": {
"type": "string"
},
"maxItems": 100,
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Records to transfer, e.g. [\"ai:gh:123\", \"ai:gh:123:mem:<hash>\"] — only your own. Omit and set `everything` instead to move them all.",
"title": "Names"
},
"to_address": {
"description": "Emercoin address that will hold the records from now on. Any valid address is accepted: one whose key you hold, or one no one holds a key to, which seals the records.",
"title": "To Address",
"type": "string"
}
},
"required": [
"to_address",
"irreversible"
],
"title": "transfer_recordsArguments",
"type": "object"
},
"name": "transfer_records",
"outputSchema": {
"$defs": {
"FeeGrantResult": {
"description": "Network-fee funds sent with a transfer: the amount in EMC, and the id of\nthe transaction that paid it — null if it could not be sent.",
"properties": {
"amount": {
"title": "Amount",
"type": "string"
},
"txid": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Txid"
}
},
"required": [
"amount",
"txid"
],
"title": "FeeGrantResult",
"type": "object"
},
"Quota": {
"description": "Writes this account has left on its tier. `writes_open_on` (a UTC date)\nappears only while the GitHub account is too new to write.",
"properties": {
"writes_left_this_minute": {
"title": "Writes Left This Minute",
"type": "integer"
},
"writes_left_today": {
"title": "Writes Left Today",
"type": "integer"
},
"writes_open_on": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Writes Open On"
}
},
"title": "Quota",
"type": "object"
}
},
"properties": {
"after": {
"title": "After",
"type": "string"
},
"count": {
"title": "Count",
"type": "integer"
},
"fee_grant": {
"anyOf": [
{
"$ref": "#/$defs/FeeGrantResult"
},
{
"type": "null"
}
]
},
"names": {
"items": {
"type": "string"
},
"title": "Names",
"type": "array"
},
"quota": {
"$ref": "#/$defs/Quota"
},
"to_address": {
"title": "To Address",
"type": "string"
},
"txid": {
"title": "Txid",
"type": "string"
}
},
"required": [
"txid",
"count",
"names",
"to_address",
"after",
"fee_grant",
"quota"
],
"title": "TransferResult",
"type": "object"
}
},
{
"description": "Report the current session's identity. Read-only, no sign-in required: an\nanonymous session gets `{authenticated: false}` with a hint (not an error),\na signed-in one gets `{authenticated: true}` plus the GitHub-rooted id, login\nand tariff. Call it to confirm who you are before `register_identity` /\n`store_memory`; an anonymous caller must sign in (GitHub OAuth) first.\n\n`github_id` is the one field you usually need: every record name is built\nfrom it — `ai:gh:<github_id>` and `ai:gh:<github_id>:mem:<hash>` — so this is\nhow you learn which names are yours to write and to read back.\n\n`tariff` is `free` for every account today; it governs the write limits,\ncurrently 10 writes per minute and 100 per trailing 24 hours per account, and\nwriting needs a GitHub account at least 30 days old. `quota` says how many\nwrites are left right now (and, for a young account, the date writes open);\nevery write returns the same figures, so plan batches with them. Note what this tool does\nnot do: it reports the session only, reading the token your client already\nholds without calling GitHub, and it proves nothing about control of an\nEmercoin address — that is what signing a challenge at login is for.",
"inputSchema": {
"properties": {},
"title": "whoamiArguments",
"type": "object"
},
"name": "whoami",
"outputSchema": {
"$defs": {
"Quota": {
"description": "Writes this account has left on its tier. `writes_open_on` (a UTC date)\nappears only while the GitHub account is too new to write.",
"properties": {
"writes_left_this_minute": {
"title": "Writes Left This Minute",
"type": "integer"
},
"writes_left_today": {
"title": "Writes Left Today",
"type": "integer"
},
"writes_open_on": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Writes Open On"
}
},
"title": "Quota",
"type": "object"
}
},
"properties": {
"authenticated": {
"default": null,
"title": "Authenticated",
"type": "boolean"
},
"github_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Github Id"
},
"github_login": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Github Login"
},
"hint": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Hint"
},
"quota": {
"anyOf": [
{
"$ref": "#/$defs/Quota"
},
{
"type": "null"
}
],
"default": null
},
"tariff": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Tariff"
}
},
"title": "WhoAmI",
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:9e0cd607eced27919d5264c8490c7adb6f9f590bf533e1e5708b7aaa267207f4 | sha256sum