vtimestamp-mcp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +122 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +21 -0
- package/build/index.js.map +1 -0
- package/build/tools.d.ts +8 -0
- package/build/tools.d.ts.map +1 -0
- package/build/tools.js +210 -0
- package/build/tools.js.map +1 -0
- package/build/types.d.ts +61 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +5 -0
- package/build/types.js.map +1 -0
- package/build/vdxf.d.ts +44 -0
- package/build/vdxf.d.ts.map +1 -0
- package/build/vdxf.js +158 -0
- package/build/vdxf.js.map +1 -0
- package/build/verus-rpc.d.ts +17 -0
- package/build/verus-rpc.d.ts.map +1 -0
- package/build/verus-rpc.js +88 -0
- package/build/verus-rpc.js.map +1 -0
- package/package.json +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 vtimestamp
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# vtimestamp-mcp
|
|
2
|
+
|
|
3
|
+
MCP server for verifying and querying [vtimestamp](https://vtimestamp.com) proofs on the Verus blockchain.
|
|
4
|
+
|
|
5
|
+
Enables AI agents (Claude Desktop, VS Code, etc.) to verify document timestamps and list all timestamps on a VerusID — directly from the blockchain.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
### Claude Desktop
|
|
10
|
+
|
|
11
|
+
Add to your `claude_desktop_config.json`:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"mcpServers": {
|
|
16
|
+
"vtimestamp": {
|
|
17
|
+
"command": "npx",
|
|
18
|
+
"args": ["-y", "vtimestamp-mcp"]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Using yarn:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"mcpServers": {
|
|
29
|
+
"vtimestamp": {
|
|
30
|
+
"command": "yarn",
|
|
31
|
+
"args": ["dlx", "vtimestamp-mcp"]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Using pnpm:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"mcpServers": {
|
|
42
|
+
"vtimestamp": {
|
|
43
|
+
"command": "pnpm",
|
|
44
|
+
"args": ["dlx", "vtimestamp-mcp"]
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### VS Code
|
|
51
|
+
|
|
52
|
+
Add to your VS Code MCP settings:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"mcp": {
|
|
57
|
+
"servers": {
|
|
58
|
+
"vtimestamp": {
|
|
59
|
+
"command": "npx",
|
|
60
|
+
"args": ["-y", "vtimestamp-mcp"]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Tools
|
|
68
|
+
|
|
69
|
+
### `vtimestamp_verify`
|
|
70
|
+
|
|
71
|
+
Verify whether a document hash has been timestamped on a VerusID.
|
|
72
|
+
|
|
73
|
+
| Parameter | Type | Required | Description |
|
|
74
|
+
|-----------|------|----------|-------------|
|
|
75
|
+
| `identity` | string | Yes | VerusID name (e.g., `alice@`) |
|
|
76
|
+
| `hash` | string | Yes | SHA-256 hash (64-character hex string) |
|
|
77
|
+
| `network` | string | No | `mainnet` (default) or `testnet` |
|
|
78
|
+
|
|
79
|
+
**Example:** "Can you check if my document has been timestamped? My VerusID is alice@ and the hash is a7f3b2c1..."
|
|
80
|
+
|
|
81
|
+
### `vtimestamp_list`
|
|
82
|
+
|
|
83
|
+
List all timestamps recorded on a VerusID.
|
|
84
|
+
|
|
85
|
+
| Parameter | Type | Required | Description |
|
|
86
|
+
|-----------|------|----------|-------------|
|
|
87
|
+
| `identity` | string | Yes | VerusID name (e.g., `alice@`) |
|
|
88
|
+
| `network` | string | No | `mainnet` (default) or `testnet` |
|
|
89
|
+
|
|
90
|
+
**Example:** "What documents has alice@ timestamped?"
|
|
91
|
+
|
|
92
|
+
### `vtimestamp_info`
|
|
93
|
+
|
|
94
|
+
Get information about the vtimestamp service.
|
|
95
|
+
|
|
96
|
+
No parameters.
|
|
97
|
+
|
|
98
|
+
**Example:** "What is vtimestamp?"
|
|
99
|
+
|
|
100
|
+
## How It Works
|
|
101
|
+
|
|
102
|
+
The server queries the public Verus RPC endpoints to read on-chain data. No wallet interaction, no API keys, no authentication required.
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
AI Agent (Claude Desktop, VS Code, etc.)
|
|
106
|
+
│ stdio (JSON-RPC)
|
|
107
|
+
▼
|
|
108
|
+
vtimestamp-mcp (local)
|
|
109
|
+
│ HTTPS (JSON-RPC 1.0)
|
|
110
|
+
▼
|
|
111
|
+
Verus Public RPC
|
|
112
|
+
├── mainnet: api.verus.services
|
|
113
|
+
└── testnet: api.verustest.net
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Requirements
|
|
117
|
+
|
|
118
|
+
- Node.js 18+
|
|
119
|
+
|
|
120
|
+
## License
|
|
121
|
+
|
|
122
|
+
MIT
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* vtimestamp MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Enables AI agents to verify and query vtimestamp proofs on the Verus blockchain.
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { registerTools } from './tools.js';
|
|
10
|
+
const server = new McpServer({
|
|
11
|
+
name: 'vtimestamp-mcp',
|
|
12
|
+
version: '1.0.0',
|
|
13
|
+
});
|
|
14
|
+
registerTools(server);
|
|
15
|
+
const transport = new StdioServerTransport();
|
|
16
|
+
await server.connect(transport);
|
|
17
|
+
process.on('SIGINT', async () => {
|
|
18
|
+
await server.close();
|
|
19
|
+
process.exit(0);
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,aAAa,CAAC,MAAM,CAAC,CAAC;AAEtB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAEhC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;IAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/build/tools.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Registrations
|
|
3
|
+
*
|
|
4
|
+
* Registers vtimestamp_verify, vtimestamp_list, and vtimestamp_info tools.
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
export declare function registerTools(server: McpServer): void;
|
|
8
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8PrD"}
|
package/build/tools.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Registrations
|
|
3
|
+
*
|
|
4
|
+
* Registers vtimestamp_verify, vtimestamp_list, and vtimestamp_info tools.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
8
|
+
import { getVdxfKeys, findTimestampByHash, parseAllTimestamps, isValidSha256, isValidIdentity } from './vdxf.js';
|
|
9
|
+
import { getIdentityHistory, getBlock, VerusRpcError, RPC_ERROR_CODES } from './verus-rpc.js';
|
|
10
|
+
export function registerTools(server) {
|
|
11
|
+
// ==========================================================================
|
|
12
|
+
// vtimestamp_verify
|
|
13
|
+
// ==========================================================================
|
|
14
|
+
server.tool('vtimestamp_verify', 'Verify whether a document hash has been timestamped on a VerusID. Returns blockchain proof details if found.', {
|
|
15
|
+
identity: z.string().describe('VerusID name (e.g., "alice@")'),
|
|
16
|
+
hash: z.string().describe('SHA-256 hash of the document (64-character hex string)'),
|
|
17
|
+
network: z.enum(['mainnet', 'testnet']).default('mainnet').describe('Verus network to query'),
|
|
18
|
+
}, async ({ identity, hash, network }) => {
|
|
19
|
+
if (!isValidIdentity(identity)) {
|
|
20
|
+
throw new McpError(ErrorCode.InvalidParams, 'Invalid identity format — must be a VerusID name ending with @ (e.g., "alice@")');
|
|
21
|
+
}
|
|
22
|
+
if (!isValidSha256(hash)) {
|
|
23
|
+
throw new McpError(ErrorCode.InvalidParams, 'Invalid hash format — must be a 64-character hex string');
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const keys = getVdxfKeys(network);
|
|
27
|
+
const historyResponse = await getIdentityHistory(identity, network);
|
|
28
|
+
const timestamp = findTimestampByHash(historyResponse.history, hash, keys);
|
|
29
|
+
if (!timestamp) {
|
|
30
|
+
return {
|
|
31
|
+
content: [
|
|
32
|
+
{
|
|
33
|
+
type: 'text',
|
|
34
|
+
text: JSON.stringify({
|
|
35
|
+
verified: false,
|
|
36
|
+
identity: historyResponse.fullyqualifiedname,
|
|
37
|
+
hash,
|
|
38
|
+
message: `No timestamp matching this hash was found on identity ${historyResponse.fullyqualifiedname}`,
|
|
39
|
+
}, null, 2),
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
let blocktime;
|
|
45
|
+
try {
|
|
46
|
+
const block = await getBlock(timestamp.blockhash, network);
|
|
47
|
+
blocktime = block.time;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Block time is optional
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: 'text',
|
|
56
|
+
text: JSON.stringify({
|
|
57
|
+
verified: true,
|
|
58
|
+
identity: historyResponse.fullyqualifiedname,
|
|
59
|
+
hash: timestamp.data.sha256,
|
|
60
|
+
title: timestamp.data.title,
|
|
61
|
+
description: timestamp.data.description ?? null,
|
|
62
|
+
filename: timestamp.data.filename ?? null,
|
|
63
|
+
filesize: timestamp.data.filesize ?? null,
|
|
64
|
+
block_height: timestamp.blockheight,
|
|
65
|
+
block_time: blocktime
|
|
66
|
+
? new Date(blocktime * 1000).toISOString()
|
|
67
|
+
: null,
|
|
68
|
+
block_hash: timestamp.blockhash,
|
|
69
|
+
transaction_id: timestamp.txid,
|
|
70
|
+
}, null, 2),
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err instanceof VerusRpcError && err.code === RPC_ERROR_CODES.IDENTITY_NOT_FOUND) {
|
|
77
|
+
return {
|
|
78
|
+
content: [
|
|
79
|
+
{
|
|
80
|
+
type: 'text',
|
|
81
|
+
text: JSON.stringify({
|
|
82
|
+
error: `Identity '${identity}' not found on ${network}`,
|
|
83
|
+
}),
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
isError: true,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (err instanceof McpError)
|
|
90
|
+
throw err;
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: 'text',
|
|
95
|
+
text: JSON.stringify({
|
|
96
|
+
error: `Failed to verify timestamp: ${err instanceof Error ? err.message : 'Unknown error'}`,
|
|
97
|
+
}),
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
isError: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// ==========================================================================
|
|
105
|
+
// vtimestamp_list
|
|
106
|
+
// ==========================================================================
|
|
107
|
+
server.tool('vtimestamp_list', 'List all timestamps recorded on a VerusID. Returns an array of timestamps with hash, title, metadata, and blockchain proof details.', {
|
|
108
|
+
identity: z.string().describe('VerusID name (e.g., "alice@")'),
|
|
109
|
+
network: z.enum(['mainnet', 'testnet']).default('mainnet').describe('Verus network to query'),
|
|
110
|
+
}, async ({ identity, network }) => {
|
|
111
|
+
if (!isValidIdentity(identity)) {
|
|
112
|
+
throw new McpError(ErrorCode.InvalidParams, 'Invalid identity format — must be a VerusID name ending with @ (e.g., "alice@")');
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const keys = getVdxfKeys(network);
|
|
116
|
+
const historyResponse = await getIdentityHistory(identity, network);
|
|
117
|
+
const timestamps = parseAllTimestamps(historyResponse.history, keys);
|
|
118
|
+
// Fetch block times for all timestamps
|
|
119
|
+
const results = await Promise.all(timestamps.map(async (ts) => {
|
|
120
|
+
let blocktime;
|
|
121
|
+
try {
|
|
122
|
+
const block = await getBlock(ts.blockhash, network);
|
|
123
|
+
blocktime = block.time;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Block time is optional
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
hash: ts.data.sha256,
|
|
130
|
+
title: ts.data.title,
|
|
131
|
+
description: ts.data.description ?? null,
|
|
132
|
+
filename: ts.data.filename ?? null,
|
|
133
|
+
filesize: ts.data.filesize ?? null,
|
|
134
|
+
block_height: ts.blockheight,
|
|
135
|
+
block_time: blocktime
|
|
136
|
+
? new Date(blocktime * 1000).toISOString()
|
|
137
|
+
: null,
|
|
138
|
+
transaction_id: ts.txid,
|
|
139
|
+
};
|
|
140
|
+
}));
|
|
141
|
+
return {
|
|
142
|
+
content: [
|
|
143
|
+
{
|
|
144
|
+
type: 'text',
|
|
145
|
+
text: JSON.stringify({
|
|
146
|
+
identity: historyResponse.fullyqualifiedname,
|
|
147
|
+
timestamp_count: results.length,
|
|
148
|
+
timestamps: results,
|
|
149
|
+
}, null, 2),
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
if (err instanceof VerusRpcError && err.code === RPC_ERROR_CODES.IDENTITY_NOT_FOUND) {
|
|
156
|
+
return {
|
|
157
|
+
content: [
|
|
158
|
+
{
|
|
159
|
+
type: 'text',
|
|
160
|
+
text: JSON.stringify({
|
|
161
|
+
error: `Identity '${identity}' not found on ${network}`,
|
|
162
|
+
}),
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
isError: true,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
content: [
|
|
170
|
+
{
|
|
171
|
+
type: 'text',
|
|
172
|
+
text: JSON.stringify({
|
|
173
|
+
error: `Failed to list timestamps: ${err instanceof Error ? err.message : 'Unknown error'}`,
|
|
174
|
+
}),
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
isError: true,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// ==========================================================================
|
|
182
|
+
// vtimestamp_info
|
|
183
|
+
// ==========================================================================
|
|
184
|
+
server.tool('vtimestamp_info', 'Get information about the vtimestamp service — what it is, how it works, and supported features.', {}, async () => {
|
|
185
|
+
return {
|
|
186
|
+
content: [
|
|
187
|
+
{
|
|
188
|
+
type: 'text',
|
|
189
|
+
text: JSON.stringify({
|
|
190
|
+
name: 'vtimestamp',
|
|
191
|
+
description: 'Decentralized document timestamping on the Verus blockchain. Creates cryptographic proof that a document existed at a specific point in time. Documents never leave the user\'s device — only a SHA-256 hash is stored on-chain, tied to the user\'s VerusID (a self-sovereign blockchain identity). Anyone can verify a timestamp without an account.',
|
|
192
|
+
website: 'https://vtimestamp.com',
|
|
193
|
+
github: 'https://github.com/vdappdev2/vtimestamp',
|
|
194
|
+
verification_url: 'https://vtimestamp.com/verify',
|
|
195
|
+
features: [
|
|
196
|
+
'Privacy-first: only hash stored, document never uploaded',
|
|
197
|
+
'Self-sovereign: timestamps stored on user\'s own VerusID',
|
|
198
|
+
'Permissionless verification: anyone can verify, no account needed',
|
|
199
|
+
'Structured metadata: title, description, filename stored on-chain',
|
|
200
|
+
'Identity-bound: proof answers both \'when\' and \'who\'',
|
|
201
|
+
'Immutable: blockchain timestamp cannot be changed or backdated',
|
|
202
|
+
],
|
|
203
|
+
supported_networks: ['mainnet', 'testnet'],
|
|
204
|
+
}, null, 2),
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjH,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE9F,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,6EAA6E;IAC7E,oBAAoB;IACpB,6EAA6E;IAE7E,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,8GAA8G,EAC9G;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC9D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;QACnF,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KAC9F,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACpC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,iFAAiF,CAClF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,WAAW,CAAC,OAAkB,CAAC,CAAC;YAC7C,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,OAAkB,CAAC,CAAC;YAC/E,MAAM,SAAS,GAAG,mBAAmB,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAE3E,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gCACE,QAAQ,EAAE,KAAK;gCACf,QAAQ,EAAE,eAAe,CAAC,kBAAkB;gCAC5C,IAAI;gCACJ,OAAO,EAAE,yDAAyD,eAAe,CAAC,kBAAkB,EAAE;6BACvG,EACD,IAAI,EACJ,CAAC,CACF;yBACF;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,SAA6B,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,OAAkB,CAAC,CAAC;gBACtE,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,QAAQ,EAAE,IAAI;4BACd,QAAQ,EAAE,eAAe,CAAC,kBAAkB;4BAC5C,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM;4BAC3B,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK;4BAC3B,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI;4BAC/C,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI;4BACzC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI;4BACzC,YAAY,EAAE,SAAS,CAAC,WAAW;4BACnC,UAAU,EAAE,SAAS;gCACnB,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;gCAC1C,CAAC,CAAC,IAAI;4BACR,UAAU,EAAE,SAAS,CAAC,SAAS;4BAC/B,cAAc,EAAE,SAAS,CAAC,IAAI;yBAC/B,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,kBAAkB,EAAE,CAAC;gBACpF,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,KAAK,EAAE,aAAa,QAAQ,kBAAkB,OAAO,EAAE;6BACxD,CAAC;yBACH;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,IAAI,GAAG,YAAY,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAEvC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;yBAC7F,CAAC;qBACH;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAE7E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,qIAAqI,EACrI;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC9D,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;KAC9F,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QAC9B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,iFAAiF,CAClF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,WAAW,CAAC,OAAkB,CAAC,CAAC;YAC7C,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,OAAkB,CAAC,CAAC;YAC/E,MAAM,UAAU,GAAG,kBAAkB,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAErE,uCAAuC;YACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC1B,IAAI,SAA6B,CAAC;gBAClC,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,OAAkB,CAAC,CAAC;oBAC/D,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC;oBACP,yBAAyB;gBAC3B,CAAC;gBAED,OAAO;oBACL,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM;oBACpB,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK;oBACpB,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI;oBACxC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI;oBAClC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI;oBAClC,YAAY,EAAE,EAAE,CAAC,WAAW;oBAC5B,UAAU,EAAE,SAAS;wBACnB,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;wBAC1C,CAAC,CAAC,IAAI;oBACR,cAAc,EAAE,EAAE,CAAC,IAAI;iBACxB,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,QAAQ,EAAE,eAAe,CAAC,kBAAkB;4BAC5C,eAAe,EAAE,OAAO,CAAC,MAAM;4BAC/B,UAAU,EAAE,OAAO;yBACpB,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,kBAAkB,EAAE,CAAC;gBACpF,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACnB,KAAK,EAAE,aAAa,QAAQ,kBAAkB,OAAO,EAAE;6BACxD,CAAC;yBACH;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,8BAA8B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;yBAC5F,CAAC;qBACH;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAE7E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,kGAAkG,EAClG,EAAE,EACF,KAAK,IAAI,EAAE;QACT,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,IAAI,EAAE,YAAY;wBAClB,WAAW,EACT,wVAAwV;wBAC1V,OAAO,EAAE,wBAAwB;wBACjC,MAAM,EAAE,yCAAyC;wBACjD,gBAAgB,EAAE,+BAA+B;wBACjD,QAAQ,EAAE;4BACR,0DAA0D;4BAC1D,0DAA0D;4BAC1D,mEAAmE;4BACnE,mEAAmE;4BACnE,yDAAyD;4BACzD,gEAAgE;yBACjE;wBACD,kBAAkB,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;qBAC3C,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/build/types.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript interfaces for vtimestamp-mcp
|
|
3
|
+
*/
|
|
4
|
+
export interface DataDescriptor {
|
|
5
|
+
version: number;
|
|
6
|
+
flags: number;
|
|
7
|
+
objectdata: {
|
|
8
|
+
message: string;
|
|
9
|
+
} | number | null;
|
|
10
|
+
label?: string;
|
|
11
|
+
mimetype?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface DataDescriptorWrapper {
|
|
14
|
+
[wrapperKey: string]: DataDescriptor;
|
|
15
|
+
}
|
|
16
|
+
export interface ContentMultiMap {
|
|
17
|
+
[outerKey: string]: DataDescriptorWrapper[];
|
|
18
|
+
}
|
|
19
|
+
export interface IdentityData {
|
|
20
|
+
version: number;
|
|
21
|
+
flags: number;
|
|
22
|
+
name: string;
|
|
23
|
+
identityaddress: string;
|
|
24
|
+
parent: string;
|
|
25
|
+
contentmultimap?: ContentMultiMap;
|
|
26
|
+
}
|
|
27
|
+
export interface IdentityHistoryEntry {
|
|
28
|
+
identity: IdentityData;
|
|
29
|
+
blockhash: string;
|
|
30
|
+
height: number;
|
|
31
|
+
output: {
|
|
32
|
+
txid: string;
|
|
33
|
+
voutnum: number;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface IdentityHistoryResponse {
|
|
37
|
+
fullyqualifiedname: string;
|
|
38
|
+
status: string;
|
|
39
|
+
history: IdentityHistoryEntry[];
|
|
40
|
+
}
|
|
41
|
+
export interface BlockData {
|
|
42
|
+
hash: string;
|
|
43
|
+
height: number;
|
|
44
|
+
time: number;
|
|
45
|
+
}
|
|
46
|
+
export interface TimestampData {
|
|
47
|
+
sha256: string;
|
|
48
|
+
title: string;
|
|
49
|
+
description?: string;
|
|
50
|
+
filename?: string;
|
|
51
|
+
filesize?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface TimestampRecord {
|
|
54
|
+
data: TimestampData;
|
|
55
|
+
blockhash: string;
|
|
56
|
+
blockheight: number;
|
|
57
|
+
blocktime?: number;
|
|
58
|
+
txid: string;
|
|
59
|
+
}
|
|
60
|
+
export type Network = 'mainnet' | 'testnet';
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,IAAI,CAAC;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC"}
|
package/build/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/build/vdxf.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VDXF Key Constants and Parsing Helpers
|
|
3
|
+
*
|
|
4
|
+
* Adapted from vtimestamp/src/lib/config.ts and vtimestamp/src/lib/vdxf.ts
|
|
5
|
+
*/
|
|
6
|
+
import type { Network, DataDescriptorWrapper, IdentityHistoryEntry, TimestampData, TimestampRecord } from './types.js';
|
|
7
|
+
interface VdxfKeys {
|
|
8
|
+
proofBasic: string;
|
|
9
|
+
dataDescriptor: string;
|
|
10
|
+
labels: {
|
|
11
|
+
sha256: string;
|
|
12
|
+
title: string;
|
|
13
|
+
description: string;
|
|
14
|
+
filename: string;
|
|
15
|
+
filesize: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare function getVdxfKeys(network: Network): VdxfKeys;
|
|
19
|
+
/**
|
|
20
|
+
* Parse timestamp data from a contentmultimap entry
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseTimestampData(entries: DataDescriptorWrapper[], keys: VdxfKeys): TimestampData | null;
|
|
23
|
+
/**
|
|
24
|
+
* Parse a single history entry into a TimestampRecord
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseHistoryEntry(entry: IdentityHistoryEntry, keys: VdxfKeys): TimestampRecord | null;
|
|
27
|
+
/**
|
|
28
|
+
* Parse all timestamps from identity history
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseAllTimestamps(history: IdentityHistoryEntry[], keys: VdxfKeys): TimestampRecord[];
|
|
31
|
+
/**
|
|
32
|
+
* Find a timestamp by its SHA-256 hash
|
|
33
|
+
*/
|
|
34
|
+
export declare function findTimestampByHash(history: IdentityHistoryEntry[], sha256: string, keys: VdxfKeys): TimestampRecord | null;
|
|
35
|
+
/**
|
|
36
|
+
* Validate a SHA-256 hash string
|
|
37
|
+
*/
|
|
38
|
+
export declare function isValidSha256(hash: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Validate a VerusID name (basic format check)
|
|
41
|
+
*/
|
|
42
|
+
export declare function isValidIdentity(identity: string): boolean;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=vdxf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vdxf.d.ts","sourceRoot":"","sources":["../src/vdxf.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,OAAO,EAEP,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,eAAe,EAChB,MAAM,YAAY,CAAC;AASpB,UAAU,QAAQ;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AA0BD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAEtD;AAmCD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,qBAAqB,EAAE,EAChC,IAAI,EAAE,QAAQ,GACb,aAAa,GAAG,IAAI,CA4BtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,QAAQ,GACb,eAAe,GAAG,IAAI,CAgBxB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,EAAE,EAC/B,IAAI,EAAE,QAAQ,GACb,eAAe,EAAE,CAYnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,EAAE,EAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,GACb,eAAe,GAAG,IAAI,CAWxB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
package/build/vdxf.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VDXF Key Constants and Parsing Helpers
|
|
3
|
+
*
|
|
4
|
+
* Adapted from vtimestamp/src/lib/config.ts and vtimestamp/src/lib/vdxf.ts
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// VDXF Key Constants
|
|
8
|
+
// ============================================================================
|
|
9
|
+
/** DataDescriptor wrapper key (same for testnet and mainnet) */
|
|
10
|
+
const DATA_DESCRIPTOR_KEY = 'i4GC1YGEVD21afWudGoFJVdnfjJ5XWnCQv';
|
|
11
|
+
const TESTNET_VDXF = {
|
|
12
|
+
proofBasic: 'i6UD4js3jqyjz9Mttmbk2Sh4eCuwLKPLyQ',
|
|
13
|
+
dataDescriptor: DATA_DESCRIPTOR_KEY,
|
|
14
|
+
labels: {
|
|
15
|
+
sha256: 'iBCkvv7KC18xd3P164Cvw1pxpLo5FyGEtm',
|
|
16
|
+
title: 'iHXGu1nW4jQoeooBHPGE58qQGf9wMakEtj',
|
|
17
|
+
description: 'iP1PCTTHPpktP26xTEu1BuwENWMHQaia4D',
|
|
18
|
+
filename: 'i4xgBqX9btMX8tnAjsyVFrgSLnigxPwBw5',
|
|
19
|
+
filesize: 'iRz2tyZZEwmrxRPSrwN8UTAC8g5KyVkBiE',
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
const MAINNET_VDXF = {
|
|
23
|
+
proofBasic: 'iJvkQ3uTKmRoFiE3rtP8YJxryLBKu8enmX',
|
|
24
|
+
dataDescriptor: DATA_DESCRIPTOR_KEY,
|
|
25
|
+
labels: {
|
|
26
|
+
sha256: 'iPRekBwQwFxNHf6mE68n8i2iXEnVdk1hw8',
|
|
27
|
+
title: 'iJx4aJf4SRByyNAi4Z93FC7QNaysyU5mdP',
|
|
28
|
+
description: 'iS8HnXSHWPL7GLkxYS4SpC7QW2Bnyp93T2',
|
|
29
|
+
filename: 'iBTcwxUDgvqGXGMC26U52522HrsXC8ggoC',
|
|
30
|
+
filesize: 'iHBnDKDyKbXeizg322cxLUps7Uodc1udF4',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
export function getVdxfKeys(network) {
|
|
34
|
+
return network === 'testnet' ? TESTNET_VDXF : MAINNET_VDXF;
|
|
35
|
+
}
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Parsing Helpers
|
|
38
|
+
// ============================================================================
|
|
39
|
+
/** VDXF flag indicating a deleted/cleared entry */
|
|
40
|
+
const FLAG_DELETED = 32;
|
|
41
|
+
function isDeleted(descriptor) {
|
|
42
|
+
return descriptor.objectdata === null || descriptor.flags === FLAG_DELETED;
|
|
43
|
+
}
|
|
44
|
+
function extractStringValue(descriptor) {
|
|
45
|
+
if (descriptor.objectdata === null)
|
|
46
|
+
return undefined;
|
|
47
|
+
if (typeof descriptor.objectdata === 'object' && 'message' in descriptor.objectdata) {
|
|
48
|
+
return descriptor.objectdata.message;
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function extractNumberValue(descriptor) {
|
|
53
|
+
if (typeof descriptor.objectdata === 'number') {
|
|
54
|
+
return descriptor.objectdata;
|
|
55
|
+
}
|
|
56
|
+
if (typeof descriptor.objectdata === 'object' && descriptor.objectdata !== null) {
|
|
57
|
+
const msg = descriptor.objectdata.message;
|
|
58
|
+
if (typeof msg === 'string') {
|
|
59
|
+
const num = parseInt(msg, 10);
|
|
60
|
+
if (!isNaN(num))
|
|
61
|
+
return num;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Parse timestamp data from a contentmultimap entry
|
|
68
|
+
*/
|
|
69
|
+
export function parseTimestampData(entries, keys) {
|
|
70
|
+
const data = {};
|
|
71
|
+
for (const wrapper of entries) {
|
|
72
|
+
const descriptor = wrapper[keys.dataDescriptor];
|
|
73
|
+
if (!descriptor || isDeleted(descriptor))
|
|
74
|
+
continue;
|
|
75
|
+
const label = descriptor.label;
|
|
76
|
+
if (!label)
|
|
77
|
+
continue;
|
|
78
|
+
if (label === keys.labels.sha256) {
|
|
79
|
+
data.sha256 = extractStringValue(descriptor);
|
|
80
|
+
}
|
|
81
|
+
else if (label === keys.labels.title) {
|
|
82
|
+
data.title = extractStringValue(descriptor);
|
|
83
|
+
}
|
|
84
|
+
else if (label === keys.labels.description) {
|
|
85
|
+
data.description = extractStringValue(descriptor);
|
|
86
|
+
}
|
|
87
|
+
else if (label === keys.labels.filename) {
|
|
88
|
+
data.filename = extractStringValue(descriptor);
|
|
89
|
+
}
|
|
90
|
+
else if (label === keys.labels.filesize) {
|
|
91
|
+
data.filesize = extractNumberValue(descriptor);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!data.sha256 || !data.title) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
return data;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Parse a single history entry into a TimestampRecord
|
|
101
|
+
*/
|
|
102
|
+
export function parseHistoryEntry(entry, keys) {
|
|
103
|
+
const contentmultimap = entry.identity.contentmultimap;
|
|
104
|
+
if (!contentmultimap)
|
|
105
|
+
return null;
|
|
106
|
+
const entries = contentmultimap[keys.proofBasic];
|
|
107
|
+
if (!entries || entries.length === 0)
|
|
108
|
+
return null;
|
|
109
|
+
const data = parseTimestampData(entries, keys);
|
|
110
|
+
if (!data)
|
|
111
|
+
return null;
|
|
112
|
+
return {
|
|
113
|
+
data,
|
|
114
|
+
blockhash: entry.blockhash,
|
|
115
|
+
blockheight: entry.height,
|
|
116
|
+
txid: entry.output.txid,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Parse all timestamps from identity history
|
|
121
|
+
*/
|
|
122
|
+
export function parseAllTimestamps(history, keys) {
|
|
123
|
+
const timestamps = [];
|
|
124
|
+
for (const entry of history) {
|
|
125
|
+
const record = parseHistoryEntry(entry, keys);
|
|
126
|
+
if (record) {
|
|
127
|
+
timestamps.push(record);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
timestamps.sort((a, b) => b.blockheight - a.blockheight);
|
|
131
|
+
return timestamps;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Find a timestamp by its SHA-256 hash
|
|
135
|
+
*/
|
|
136
|
+
export function findTimestampByHash(history, sha256, keys) {
|
|
137
|
+
const normalizedHash = sha256.toLowerCase();
|
|
138
|
+
for (const entry of history) {
|
|
139
|
+
const record = parseHistoryEntry(entry, keys);
|
|
140
|
+
if (record && record.data.sha256.toLowerCase() === normalizedHash) {
|
|
141
|
+
return record;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Validate a SHA-256 hash string
|
|
148
|
+
*/
|
|
149
|
+
export function isValidSha256(hash) {
|
|
150
|
+
return /^[a-fA-F0-9]{64}$/.test(hash);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Validate a VerusID name (basic format check)
|
|
154
|
+
*/
|
|
155
|
+
export function isValidIdentity(identity) {
|
|
156
|
+
return identity.endsWith('@') && identity.length >= 2;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=vdxf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vdxf.js","sourceRoot":"","sources":["../src/vdxf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verus RPC Client
|
|
3
|
+
*
|
|
4
|
+
* Fetch-based JSON-RPC 1.0 client with automatic fallback endpoints.
|
|
5
|
+
* Adapted from vtimestamp/src/lib/server/verus.ts
|
|
6
|
+
*/
|
|
7
|
+
import type { Network, IdentityHistoryResponse, BlockData } from './types.js';
|
|
8
|
+
export declare class VerusRpcError extends Error {
|
|
9
|
+
code: number;
|
|
10
|
+
constructor(code: number, message: string);
|
|
11
|
+
}
|
|
12
|
+
export declare const RPC_ERROR_CODES: {
|
|
13
|
+
readonly IDENTITY_NOT_FOUND: -5;
|
|
14
|
+
};
|
|
15
|
+
export declare function getIdentityHistory(identity: string, network: Network): Promise<IdentityHistoryResponse>;
|
|
16
|
+
export declare function getBlock(blockhash: string, network: Network): Promise<BlockData>;
|
|
17
|
+
//# sourceMappingURL=verus-rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verus-rpc.d.ts","sourceRoot":"","sources":["../src/verus-rpc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAuB9E,qBAAa,aAAc,SAAQ,KAAK;IACtC,IAAI,EAAE,MAAM,CAAC;gBAED,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,eAAO,MAAM,eAAe;;CAElB,CAAC;AA4EX,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,uBAAuB,CAAC,CAElC;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,SAAS,CAAC,CAEpB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verus RPC Client
|
|
3
|
+
*
|
|
4
|
+
* Fetch-based JSON-RPC 1.0 client with automatic fallback endpoints.
|
|
5
|
+
* Adapted from vtimestamp/src/lib/server/verus.ts
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Configuration
|
|
9
|
+
// ============================================================================
|
|
10
|
+
const RPC_ENDPOINTS = {
|
|
11
|
+
mainnet: {
|
|
12
|
+
primary: 'https://api.verus.services',
|
|
13
|
+
fallback: 'https://rpc.vrsc.syncproof.net',
|
|
14
|
+
},
|
|
15
|
+
testnet: {
|
|
16
|
+
primary: 'https://api.verustest.net',
|
|
17
|
+
fallback: null,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const RPC_TIMEOUT = 30_000;
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Error Class
|
|
23
|
+
// ============================================================================
|
|
24
|
+
export class VerusRpcError extends Error {
|
|
25
|
+
code;
|
|
26
|
+
constructor(code, message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = 'VerusRpcError';
|
|
29
|
+
this.code = code;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export const RPC_ERROR_CODES = {
|
|
33
|
+
IDENTITY_NOT_FOUND: -5,
|
|
34
|
+
};
|
|
35
|
+
async function rpcCallToEndpoint(endpoint, method, params = []) {
|
|
36
|
+
const request = {
|
|
37
|
+
jsonrpc: '1.0',
|
|
38
|
+
id: `vtimestamp-mcp-${Date.now()}`,
|
|
39
|
+
method,
|
|
40
|
+
params,
|
|
41
|
+
};
|
|
42
|
+
const response = await fetch(endpoint, {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: { 'Content-Type': 'text/plain' },
|
|
45
|
+
body: JSON.stringify(request),
|
|
46
|
+
signal: AbortSignal.timeout(RPC_TIMEOUT),
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`RPC HTTP error: ${response.status} ${response.statusText}`);
|
|
50
|
+
}
|
|
51
|
+
const data = await response.json();
|
|
52
|
+
if (data.error) {
|
|
53
|
+
throw new VerusRpcError(data.error.code, data.error.message);
|
|
54
|
+
}
|
|
55
|
+
if (data.result === null) {
|
|
56
|
+
throw new Error(`RPC returned null result for method ${method}`);
|
|
57
|
+
}
|
|
58
|
+
return data.result;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Make an RPC call with automatic fallback on network errors.
|
|
62
|
+
* RPC errors (like identity not found) are NOT retried on fallback.
|
|
63
|
+
*/
|
|
64
|
+
async function rpcCall(network, method, params = []) {
|
|
65
|
+
const endpoints = RPC_ENDPOINTS[network];
|
|
66
|
+
try {
|
|
67
|
+
return await rpcCallToEndpoint(endpoints.primary, method, params);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error instanceof VerusRpcError) {
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
if (!endpoints.fallback) {
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
return await rpcCallToEndpoint(endpoints.fallback, method, params);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ============================================================================
|
|
80
|
+
// RPC Methods
|
|
81
|
+
// ============================================================================
|
|
82
|
+
export async function getIdentityHistory(identity, network) {
|
|
83
|
+
return rpcCall(network, 'getidentityhistory', [identity]);
|
|
84
|
+
}
|
|
85
|
+
export async function getBlock(blockhash, network) {
|
|
86
|
+
return rpcCall(network, 'getblock', [blockhash]);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=verus-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verus-rpc.js","sourceRoot":"","sources":["../src/verus-rpc.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "vtimestamp-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for verifying and querying vtimestamp proofs on the Verus blockchain",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"vtimestamp-mcp": "./build/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"build"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"prepare": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"mcp",
|
|
18
|
+
"verus",
|
|
19
|
+
"timestamp",
|
|
20
|
+
"blockchain",
|
|
21
|
+
"proof-of-existence",
|
|
22
|
+
"verification"
|
|
23
|
+
],
|
|
24
|
+
"author": "vtimestamp",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"homepage": "https://vtimestamp.com",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/vdappdev2/vtimestamp-mcp.git"
|
|
30
|
+
},
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/vdappdev2/vtimestamp-mcp/issues"
|
|
33
|
+
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=18.0.0"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
39
|
+
"zod": "^3.23.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^22.0.0",
|
|
43
|
+
"typescript": "^5.7.0"
|
|
44
|
+
}
|
|
45
|
+
}
|