@provenonce/mcp 1.0.3 β 1.0.5
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/README.md +126 -153
- package/dist/index.js +27 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,153 +1,126 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
β β βββ v0/ # Version 0 API types
|
|
128
|
-
β βββ model/ # Data models for server.json
|
|
129
|
-
βββ scripts/ # Development and testing scripts
|
|
130
|
-
βββ tests/ # Integration tests
|
|
131
|
-
βββ tools/ # CLI tools and utilities
|
|
132
|
-
βββ validate-*.sh # Schema validation tools
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### Authentication
|
|
136
|
-
|
|
137
|
-
Publishing supports multiple authentication methods:
|
|
138
|
-
- **GitHub OAuth** - For publishing by logging into GitHub
|
|
139
|
-
- **GitHub OIDC** - For publishing from GitHub Actions
|
|
140
|
-
- **DNS verification** - For proving ownership of a domain and its subdomains
|
|
141
|
-
- **HTTP verification** - For proving ownership of a domain
|
|
142
|
-
|
|
143
|
-
The registry validates namespace ownership when publishing. E.g. to publish...:
|
|
144
|
-
- `io.github.domdomegg/my-cool-mcp` you must login to GitHub as `domdomegg`, or be in a GitHub Action on domdomegg's repos
|
|
145
|
-
- `me.adamjones/my-cool-mcp` you must prove ownership of `adamjones.me` via DNS or HTTP challenge
|
|
146
|
-
|
|
147
|
-
## Community Projects
|
|
148
|
-
|
|
149
|
-
Check out [community projects](docs/community-projects.md) to explore notable registry-related work created by the community.
|
|
150
|
-
|
|
151
|
-
## More documentation
|
|
152
|
-
|
|
153
|
-
See the [documentation](./docs) for more details if your question has not been answered here!
|
|
1
|
+
# @provenonce/mcp
|
|
2
|
+
|
|
3
|
+
**Provenonce Skill** β Give any AI agent cryptographic identity in under 60 seconds.
|
|
4
|
+
|
|
5
|
+
Add this skill to your agent and it gets:
|
|
6
|
+
- A permanent cryptographic hash (identity)
|
|
7
|
+
- A SIGIL (verified identity class + tier)
|
|
8
|
+
- A signed Passport (verifiable offline by any third party)
|
|
9
|
+
- Heartbeat (continuous liveness proof)
|
|
10
|
+
- Beats proofs (evidence of computational work)
|
|
11
|
+
- Lineage (full ancestry chain)
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
### Claude Desktop / Claude Code
|
|
16
|
+
|
|
17
|
+
Add to `~/.claude/claude_desktop_config.json`:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"mcpServers": {
|
|
22
|
+
"provenonce": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": ["-y", "@provenonce/mcp"]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
That's it. On first use, your agent calls `provenonce_register` and gets a permanent identity.
|
|
31
|
+
|
|
32
|
+
### With pre-existing credentials
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"provenonce": {
|
|
38
|
+
"command": "npx",
|
|
39
|
+
"args": ["-y", "@provenonce/mcp"],
|
|
40
|
+
"env": {
|
|
41
|
+
"PROVENONCE_API_KEY": "pvn_...",
|
|
42
|
+
"PROVENONCE_AGENT_HASH": "0x..."
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### As a skill developer (earn rev share)
|
|
50
|
+
|
|
51
|
+
If you're a developer embedding this skill in your framework, include your partner ref token:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"env": {
|
|
56
|
+
"PROVENONCE_SKILL_REF": "your16hextoken"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
You earn 30% of every SIGIL purchased by agents you deploy. Register at `POST /api/v1/skill/register`.
|
|
62
|
+
|
|
63
|
+
## The 9 Tools
|
|
64
|
+
|
|
65
|
+
| Tool | What it does | Auth needed |
|
|
66
|
+
|------|-------------|-------------|
|
|
67
|
+
| `provenonce_register` | Auto-register agent, get hash + API key | None |
|
|
68
|
+
| `provenonce_status` | Full current state (SIGIL, balance, hints) | Yes |
|
|
69
|
+
| `provenonce_purchase_sigil` | Buy SIGIL, unlock heartbeat + passport | Yes + SOL tx |
|
|
70
|
+
| `provenonce_heartbeat` | Submit liveness proof | Yes + SOL tx |
|
|
71
|
+
| `provenonce_get_passport` | Get signed identity document | Yes |
|
|
72
|
+
| `provenonce_beats_proof` | Compute local work proof | None |
|
|
73
|
+
| `provenonce_verify_agent` | Check another agent's identity | None |
|
|
74
|
+
| `provenonce_spawn` | Spawn a child agent | Yes |
|
|
75
|
+
| `provenonce_get_lineage` | Get full ancestry chain | None |
|
|
76
|
+
|
|
77
|
+
## Agent Flow
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
Day 1: provenonce_register β hash minted, credentials saved
|
|
81
|
+
provenonce_beats_proof β works immediately, no SIGIL needed
|
|
82
|
+
provenonce_status β { sigil: null, _hint: "Call provenonce_purchase_sigil..." }
|
|
83
|
+
|
|
84
|
+
Day 7: provenonce_purchase_sigil β pay SOL, SIGIL issued
|
|
85
|
+
provenonce_heartbeat β now unlocked
|
|
86
|
+
provenonce_get_passport β signed identity doc, share with anyone
|
|
87
|
+
provenonce_verify_agent β verify a counterparty before trusting them
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Environment Variables
|
|
91
|
+
|
|
92
|
+
| Variable | Description | Default |
|
|
93
|
+
|----------|-------------|---------|
|
|
94
|
+
| `PROVENONCE_API_KEY` | Agent API key (pvn_...) | Read from ~/.provenonce/config.json |
|
|
95
|
+
| `PROVENONCE_AGENT_HASH` | Agent hash (0x...) | Read from ~/.provenonce/config.json |
|
|
96
|
+
| `PROVENONCE_SKILL_REF` | Your partner ref token (for rev share) | None |
|
|
97
|
+
| `PROVENONCE_REGISTRY_URL` | Registry URL override | https://provenonce.io |
|
|
98
|
+
|
|
99
|
+
## Framework-Agnostic Usage
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { PROVENONCE_TOOLS } from '@provenonce/mcp/tools';
|
|
103
|
+
|
|
104
|
+
// OpenAI
|
|
105
|
+
const tools = PROVENONCE_TOOLS.map(t => ({ type: 'function', function: t }));
|
|
106
|
+
|
|
107
|
+
// LangChain / custom β use PROVENONCE_TOOLS for schema, implement handlers yourself
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Credential Storage
|
|
111
|
+
|
|
112
|
+
Credentials are stored in `~/.provenonce/config.json` with `chmod 600` permissions (Unix).
|
|
113
|
+
|
|
114
|
+
On Windows, use environment variables (`PROVENONCE_API_KEY` + `PROVENONCE_AGENT_HASH`) β file permissions are not enforced.
|
|
115
|
+
|
|
116
|
+
## What's Coming
|
|
117
|
+
|
|
118
|
+
- `provenonce_kyc` β KYC / identity class upgrade
|
|
119
|
+
- Auto-heartbeat timer (opt-in)
|
|
120
|
+
- Python SDK (`provenonce-mcp`)
|
|
121
|
+
|
|
122
|
+
## Links
|
|
123
|
+
|
|
124
|
+
- Registry: [provenonce.io](https://provenonce.io)
|
|
125
|
+
- Docs: [provenonce.dev](https://provenonce.dev)
|
|
126
|
+
- API: [provenonce.io/openapi.yaml](https://provenonce.io/openapi.yaml)
|
package/dist/index.js
CHANGED
|
@@ -81,14 +81,35 @@ async function apiFetch(path, opts = {}) {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
async function registerAgent(opts) {
|
|
84
|
-
|
|
84
|
+
const tokenRes = await apiFetch("/api/v1/register/token", {
|
|
85
85
|
method: "POST",
|
|
86
|
-
body: {
|
|
87
|
-
name: opts.name,
|
|
88
|
-
wallet: "none",
|
|
89
|
-
...opts.skillRef ? { ref: opts.skillRef } : {}
|
|
90
|
-
}
|
|
86
|
+
body: {}
|
|
91
87
|
});
|
|
88
|
+
if (tokenRes.error || !tokenRes.data?.token) {
|
|
89
|
+
return { data: null, error: tokenRes.error ?? "Failed to obtain registration token" };
|
|
90
|
+
}
|
|
91
|
+
const headers = {
|
|
92
|
+
"Content-Type": "application/json",
|
|
93
|
+
"x-registration-token": tokenRes.data.token
|
|
94
|
+
};
|
|
95
|
+
try {
|
|
96
|
+
const res = await fetch(`${REGISTRY_URL}/api/v1/register`, {
|
|
97
|
+
method: "POST",
|
|
98
|
+
headers,
|
|
99
|
+
body: JSON.stringify({
|
|
100
|
+
name: opts.name,
|
|
101
|
+
wallet: "none",
|
|
102
|
+
...opts.skillRef ? { ref: opts.skillRef } : {}
|
|
103
|
+
})
|
|
104
|
+
});
|
|
105
|
+
const json = await res.json();
|
|
106
|
+
if (!res.ok) {
|
|
107
|
+
return { data: null, error: json.error ?? `HTTP ${res.status}` };
|
|
108
|
+
}
|
|
109
|
+
return { data: json, error: null };
|
|
110
|
+
} catch (err2) {
|
|
111
|
+
return { data: null, error: err2.message };
|
|
112
|
+
}
|
|
92
113
|
}
|
|
93
114
|
async function getStatus(apiKey) {
|
|
94
115
|
return apiFetch("/api/v1/skill/bootstrap", {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/handlers.ts","../src/credentials.ts","../src/client.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport {\r\n CallToolRequestSchema,\r\n ListToolsRequestSchema,\r\n} from '@modelcontextprotocol/sdk/types.js';\r\n\r\nimport { PROVENONCE_TOOLS } from './tools.js';\r\nimport {\r\n handleRegister,\r\n handleStatus,\r\n handlePurchaseSigil,\r\n handleHeartbeat,\r\n handleGetPassport,\r\n handleBeatsProof,\r\n handleVerifyAgent,\r\n handleSpawn,\r\n handleGetLineage,\r\n} from './handlers.js';\r\n\r\nconst server = new Server(\r\n { name: 'provenonce', version: '1.0.0' },\r\n { capabilities: { tools: {} } },\r\n);\r\n\r\n// List available tools\r\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\r\n tools: PROVENONCE_TOOLS.map((t) => ({\r\n name: t.name,\r\n description: t.description,\r\n inputSchema: t.inputSchema,\r\n })),\r\n}));\r\n\r\n// Handle tool calls\r\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\r\n const { name, arguments: args = {} } = request.params;\r\n const a = args as Record<string, unknown>;\r\n\r\n switch (name) {\r\n case 'provenonce_register':\r\n return handleRegister({\r\n name: a.name as string | undefined,\r\n skill_ref: a.skill_ref as string | undefined,\r\n });\r\n\r\n case 'provenonce_status':\r\n return handleStatus();\r\n\r\n case 'provenonce_purchase_sigil':\r\n return handlePurchaseSigil({\r\n name: a.name as string,\r\n principal: a.principal as string,\r\n identity_class: a.identity_class as string,\r\n tier: a.tier as string,\r\n payment_tx: a.payment_tx as string,\r\n });\r\n\r\n case 'provenonce_heartbeat':\r\n return handleHeartbeat({ payment_tx: a.payment_tx as string });\r\n\r\n case 'provenonce_get_passport':\r\n return handleGetPassport({ payment_tx: a.payment_tx as string | undefined });\r\n\r\n case 'provenonce_beats_proof':\r\n return handleBeatsProof({ count: a.count as number });\r\n\r\n case 'provenonce_verify_agent':\r\n return handleVerifyAgent({ hash: a.hash as string });\r\n\r\n case 'provenonce_spawn':\r\n return handleSpawn({ child_name: a.child_name as string });\r\n\r\n case 'provenonce_get_lineage':\r\n return handleGetLineage({ hash: a.hash as string | undefined });\r\n\r\n default:\r\n return {\r\n content: [{ type: 'text', text: `Unknown tool: ${name}` }],\r\n isError: true,\r\n };\r\n }\r\n});\r\n\r\n// Start stdio transport\r\nasync function main() {\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n\r\nmain().catch((err) => {\r\n process.stderr.write(`Fatal: ${(err as Error).message}\\n`);\r\n process.exit(1);\r\n});\r\n","import { createHash } from 'crypto';\r\nimport { loadCredentials, saveCredentials } from './credentials.js';\r\nimport * as api from './client.js';\r\n\r\nfunction requireCredentials() {\r\n const creds = loadCredentials();\r\n if (!creds) {\r\n throw new Error(\r\n 'Not registered. Call provenonce_register first.',\r\n );\r\n }\r\n return creds;\r\n}\r\n\r\nfunction ok(data: unknown): { content: [{ type: 'text'; text: string }] } {\r\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\r\n}\r\n\r\nfunction err(message: string): { content: [{ type: 'text'; text: string }]; isError: true } {\r\n return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };\r\n}\r\n\r\n// ββ provenonce_register βββββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleRegister(args: { name?: string; skill_ref?: string }) {\r\n // Return existing identity if already registered\r\n const existing = loadCredentials();\r\n if (existing) {\r\n const { data, error } = await api.getStatus(existing.api_key);\r\n if (data) {\r\n return ok({\r\n registered: false,\r\n message: 'Already registered β returning existing identity.',\r\n hash: existing.agent_hash,\r\n sigil: data.sigil,\r\n identity_class: data.identity_class,\r\n _hint: data._hint,\r\n });\r\n }\r\n if (error) {\r\n // Credentials stale or invalid β fall through to re-register\r\n }\r\n }\r\n\r\n const { data, error } = await api.registerAgent({\r\n name: args.name,\r\n skillRef: args.skill_ref,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'Registration failed');\r\n\r\n saveCredentials({ api_key: data.api_key, agent_hash: data.hash });\r\n\r\n return ok({\r\n registered: true,\r\n hash: data.hash,\r\n api_key: data.api_key,\r\n depth: data.depth,\r\n message: 'Agent registered. Credentials saved. Call provenonce_status to see your full state.',\r\n _warning: 'Save your api_key securely. It will not be shown again after this session.',\r\n });\r\n}\r\n\r\n// ββ provenonce_status βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleStatus() {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.getStatus(creds.api_key);\r\n if (error || !data) return err(error ?? 'Failed to get status');\r\n return ok(data);\r\n}\r\n\r\n// ββ provenonce_purchase_sigil βββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handlePurchaseSigil(args: {\r\n name: string;\r\n principal: string;\r\n identity_class: string;\r\n tier: string;\r\n payment_tx: string;\r\n}) {\r\n const creds = requireCredentials();\r\n const skillRef = process.env.PROVENONCE_SKILL_REF;\r\n\r\n const { data, error } = await api.purchaseSigil(creds.api_key, {\r\n name: args.name,\r\n principal: args.principal,\r\n identity_class: args.identity_class,\r\n tier: args.tier,\r\n payment_tx: args.payment_tx,\r\n skillRef,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'SIGIL purchase failed');\r\n\r\n return ok({\r\n ...data,\r\n heartbeat_unlocked: true,\r\n message: `SIGIL issued: ${data.sigil}. You can now call provenonce_heartbeat and provenonce_get_passport.`,\r\n });\r\n}\r\n\r\n// ββ provenonce_heartbeat ββββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleHeartbeat(args: { payment_tx: string }) {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.heartbeat(creds.api_key, args.payment_tx);\r\n if (error || !data) return err(error ?? 'Heartbeat failed');\r\n\r\n if (!data.ok && data.sigil_required) {\r\n return err('SIGIL required. Call provenonce_purchase_sigil first.');\r\n }\r\n\r\n return ok({\r\n ok: data.ok,\r\n message: data.ok ? 'Heartbeat recorded. Agent liveness confirmed.' : 'Heartbeat failed.',\r\n });\r\n}\r\n\r\n// ββ provenonce_get_passport βββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleGetPassport(args: { payment_tx?: string }) {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.getPassport(creds.api_key, args.payment_tx);\r\n if (error || !data) return err(error ?? 'Passport retrieval failed');\r\n\r\n return ok({\r\n passport: data.lineage_proof,\r\n message:\r\n 'Passport issued. Share this signed document with any third party to prove your identity offline.',\r\n _verify:\r\n 'Verify at: GET https://provenonce.io/.well-known/provenonce-authority.json for the authority public key.',\r\n });\r\n}\r\n\r\n// ββ provenonce_beats_proof ββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleBeatsProof(args: { count: number }) {\r\n const count = Math.max(10, Math.min(1000, args.count));\r\n const creds = loadCredentials();\r\n const seed = creds?.agent_hash ?? `provenonce:beats:${Date.now()}`;\r\n\r\n const start = Date.now();\r\n let hash = createHash('sha256').update(seed).digest('hex');\r\n const fromHash = `0x${hash}`;\r\n\r\n for (let i = 1; i < count; i++) {\r\n hash = createHash('sha256').update(hash).digest('hex');\r\n }\r\n\r\n const toHash = `0x${hash}`;\r\n const duration = Date.now() - start;\r\n\r\n return ok({\r\n from_hash: fromHash,\r\n to_hash: toHash,\r\n beats_computed: count,\r\n duration_ms: duration,\r\n message: `Computed ${count} beats in ${duration}ms. This is cryptographic proof of computational work.`,\r\n });\r\n}\r\n\r\n// ββ provenonce_verify_agent βββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleVerifyAgent(args: { hash: string }) {\r\n const { data, error } = await api.verifyAgent(args.hash);\r\n if (error || !data) return err(error ?? 'Verification failed');\r\n return ok(data);\r\n}\r\n\r\n// ββ provenonce_spawn ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleSpawn(args: { child_name: string }) {\r\n const creds = requireCredentials();\r\n\r\n const { data, error } = await api.spawnChild(creds.api_key, {\r\n childName: args.child_name,\r\n parentHash: creds.agent_hash,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'Spawn failed');\r\n\r\n return ok({\r\n ...data,\r\n message: `Child agent spawned: ${data.child_hash}. Save the child_api_key β it will not be shown again.`,\r\n _warning: 'The child agent has its own identity. Configure it with PROVENONCE_API_KEY + PROVENONCE_AGENT_HASH.',\r\n });\r\n}\r\n\r\n// ββ provenonce_get_lineage ββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleGetLineage(args: { hash?: string }) {\r\n const creds = loadCredentials();\r\n const targetHash = args.hash ?? creds?.agent_hash;\r\n\r\n if (!targetHash) {\r\n return err('No hash provided and agent is not registered. Call provenonce_register first or provide a hash.');\r\n }\r\n\r\n const { data, error } = await api.getLineage(targetHash);\r\n if (error || !data) return err(error ?? 'Lineage retrieval failed');\r\n return ok(data);\r\n}\r\n","import { readFileSync, writeFileSync, mkdirSync, chmodSync, existsSync } from 'fs';\r\nimport { join } from 'path';\r\nimport { homedir } from 'os';\r\nimport type { StoredCredentials } from './types.js';\r\n\r\nfunction getConfigDir(): string {\r\n return join(homedir(), '.provenonce');\r\n}\r\n\r\nfunction getConfigPath(): string {\r\n return join(getConfigDir(), 'config.json');\r\n}\r\n\r\n/** Load credentials β env vars take priority over config file */\r\nexport function loadCredentials(): StoredCredentials | null {\r\n const apiKey = process.env.PROVENONCE_API_KEY;\r\n const agentHash = process.env.PROVENONCE_AGENT_HASH;\r\n\r\n if (apiKey && agentHash) {\r\n return { api_key: apiKey, agent_hash: agentHash };\r\n }\r\n\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) return null;\r\n\r\n try {\r\n const raw = readFileSync(configPath, 'utf-8');\r\n const parsed = JSON.parse(raw) as Partial<StoredCredentials>;\r\n if (parsed.api_key && parsed.agent_hash) {\r\n return { api_key: parsed.api_key, agent_hash: parsed.agent_hash };\r\n }\r\n } catch {\r\n // Corrupt config β treat as missing\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/** Persist credentials to ~/.provenonce/config.json (chmod 600) */\r\nexport function saveCredentials(creds: StoredCredentials): void {\r\n const dir = getConfigDir();\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n const configPath = getConfigPath();\r\n const data: StoredCredentials = {\r\n api_key: creds.api_key,\r\n agent_hash: creds.agent_hash,\r\n };\r\n\r\n writeFileSync(configPath, JSON.stringify(data, null, 2), 'utf-8');\r\n\r\n // chmod 600 β owner read/write only (Unix only; no-op on Windows)\r\n try {\r\n chmodSync(configPath, 0o600);\r\n } catch {\r\n // Windows β chmod not supported; recommend env var instead\r\n }\r\n}\r\n\r\n/** Clear stored credentials */\r\nexport function clearCredentials(): void {\r\n const configPath = getConfigPath();\r\n if (existsSync(configPath)) {\r\n writeFileSync(configPath, '{}', 'utf-8');\r\n }\r\n}\r\n","import type {\r\n RegisterResult,\r\n AgentStatus,\r\n HeartbeatResult,\r\n PassportResult,\r\n SigilResult,\r\n VerifyAgentResult,\r\n LineageResult,\r\n SpawnResult,\r\n} from './types.js';\r\n\r\nconst REGISTRY_URL = process.env.PROVENONCE_REGISTRY_URL || 'https://provenonce.io';\r\n\r\nasync function apiFetch<T>(\r\n path: string,\r\n opts: { method?: string; body?: unknown; apiKey?: string; isPublic?: boolean } = {},\r\n): Promise<{ data: T | null; error: string | null }> {\r\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\r\n if (opts.apiKey) headers['Authorization'] = `Bearer ${opts.apiKey}`;\r\n\r\n try {\r\n const res = await fetch(`${REGISTRY_URL}${path}`, {\r\n method: opts.method ?? 'GET',\r\n headers,\r\n body: opts.body ? JSON.stringify(opts.body) : undefined,\r\n });\r\n\r\n const json = await res.json() as Record<string, unknown>;\r\n\r\n if (!res.ok) {\r\n const msg = (json.error as string) ?? `HTTP ${res.status}`;\r\n return { data: null, error: msg };\r\n }\r\n\r\n return { data: json as T, error: null };\r\n } catch (err) {\r\n return { data: null, error: (err as Error).message };\r\n }\r\n}\r\n\r\n/** Register a new agent (no-wallet path) */\r\nexport async function registerAgent(opts: {\r\n name?: string;\r\n skillRef?: string;\r\n}): Promise<{ data: RegisterResult | null; error: string | null }> {\r\n return apiFetch<RegisterResult>('/api/v1/register', {\r\n method: 'POST',\r\n body: {\r\n name: opts.name,\r\n wallet: 'none',\r\n ...(opts.skillRef ? { ref: opts.skillRef } : {}),\r\n },\r\n });\r\n}\r\n\r\n/** Get full agent status */\r\nexport async function getStatus(apiKey: string): Promise<{ data: AgentStatus | null; error: string | null }> {\r\n return apiFetch<AgentStatus>('/api/v1/skill/bootstrap', {\r\n method: 'POST',\r\n apiKey,\r\n body: {},\r\n });\r\n}\r\n\r\n/** Submit heartbeat */\r\nexport async function heartbeat(apiKey: string, paymentTx?: string): Promise<{ data: HeartbeatResult | null; error: string | null }> {\r\n return apiFetch<HeartbeatResult>('/api/v1/agent/heartbeat', {\r\n method: 'POST',\r\n apiKey,\r\n body: { payment_tx: paymentTx },\r\n });\r\n}\r\n\r\n/** Reissue passport / lineage proof */\r\nexport async function getPassport(apiKey: string, paymentTx?: string): Promise<{ data: { lineage_proof: PassportResult } | null; error: string | null }> {\r\n return apiFetch<{ lineage_proof: PassportResult }>('/api/v1/agent/reissue-proof', {\r\n method: 'POST',\r\n apiKey,\r\n body: paymentTx ? { payment_tx: paymentTx } : {},\r\n });\r\n}\r\n\r\n/** Purchase a SIGIL */\r\nexport async function purchaseSigil(apiKey: string, opts: {\r\n name: string;\r\n principal: string;\r\n identity_class: string;\r\n tier: string;\r\n payment_tx: string;\r\n skillRef?: string;\r\n}): Promise<{ data: SigilResult | null; error: string | null }> {\r\n return apiFetch<SigilResult>('/api/v1/sigil', {\r\n method: 'POST',\r\n apiKey,\r\n body: {\r\n name: opts.name,\r\n principal: opts.principal,\r\n identity_class: opts.identity_class,\r\n tier: opts.tier,\r\n payment_tx: opts.payment_tx,\r\n ...(opts.skillRef ? { ref: opts.skillRef } : {}),\r\n },\r\n });\r\n}\r\n\r\n/** Verify another agent's identity (public) */\r\nexport async function verifyAgent(hash: string): Promise<{ data: VerifyAgentResult | null; error: string | null }> {\r\n return apiFetch<VerifyAgentResult>(`/api/v1/verify/${encodeURIComponent(hash)}`);\r\n}\r\n\r\n/** Get agent lineage chain (public) */\r\nexport async function getLineage(hash: string): Promise<{ data: LineageResult | null; error: string | null }> {\r\n return apiFetch<LineageResult>(`/api/v1/agent/lineage/${encodeURIComponent(hash)}`);\r\n}\r\n\r\n/** Spawn a child agent β handles full 3-step flow internally */\r\nexport async function spawnChild(apiKey: string, opts: {\r\n childName: string;\r\n parentHash: string;\r\n}): Promise<{ data: SpawnResult | null; error: string | null }> {\r\n // Step 1: Get spawn authorization\r\n const step1 = await apiFetch<{\r\n spawn_authorization: string;\r\n child_name?: string;\r\n }>('/api/v1/agent/spawn', {\r\n method: 'POST',\r\n apiKey,\r\n body: { child_name: opts.childName },\r\n });\r\n\r\n if (step1.error || !step1.data?.spawn_authorization) {\r\n return { data: null, error: step1.error ?? 'Spawn step 1 failed: no authorization returned' };\r\n }\r\n\r\n const spawnAuth = step1.data.spawn_authorization;\r\n\r\n // Step 2: Register the child with the spawn_authorization\r\n const reg = await apiFetch<RegisterResult>('/api/v1/register', {\r\n method: 'POST',\r\n apiKey,\r\n body: {\r\n name: opts.childName,\r\n wallet: 'none',\r\n spawn_authorization: spawnAuth,\r\n },\r\n });\r\n\r\n if (reg.error || !reg.data?.hash) {\r\n return { data: null, error: reg.error ?? 'Spawn step 2 (child registration) failed' };\r\n }\r\n\r\n const childHash = reg.data.hash;\r\n const childApiKey = reg.data.api_key;\r\n\r\n // Step 3: Finalize the spawn\r\n const step3 = await apiFetch<{ ok: boolean }>('/api/v1/agent/spawn', {\r\n method: 'POST',\r\n apiKey,\r\n body: { child_hash: childHash },\r\n });\r\n\r\n if (step3.error) {\r\n return { data: null, error: step3.error };\r\n }\r\n\r\n return {\r\n data: {\r\n child_hash: childHash,\r\n child_api_key: childApiKey,\r\n child_depth: reg.data.depth,\r\n parent_hash: opts.parentHash,\r\n },\r\n error: null,\r\n };\r\n}\r\n"],"mappings":"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","names":["err","data","error","err"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/handlers.ts","../src/credentials.ts","../src/client.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport {\r\n CallToolRequestSchema,\r\n ListToolsRequestSchema,\r\n} from '@modelcontextprotocol/sdk/types.js';\r\n\r\nimport { PROVENONCE_TOOLS } from './tools.js';\r\nimport {\r\n handleRegister,\r\n handleStatus,\r\n handlePurchaseSigil,\r\n handleHeartbeat,\r\n handleGetPassport,\r\n handleBeatsProof,\r\n handleVerifyAgent,\r\n handleSpawn,\r\n handleGetLineage,\r\n} from './handlers.js';\r\n\r\nconst server = new Server(\r\n { name: 'provenonce', version: '1.0.0' },\r\n { capabilities: { tools: {} } },\r\n);\r\n\r\n// List available tools\r\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\r\n tools: PROVENONCE_TOOLS.map((t) => ({\r\n name: t.name,\r\n description: t.description,\r\n inputSchema: t.inputSchema,\r\n })),\r\n}));\r\n\r\n// Handle tool calls\r\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\r\n const { name, arguments: args = {} } = request.params;\r\n const a = args as Record<string, unknown>;\r\n\r\n switch (name) {\r\n case 'provenonce_register':\r\n return handleRegister({\r\n name: a.name as string | undefined,\r\n skill_ref: a.skill_ref as string | undefined,\r\n });\r\n\r\n case 'provenonce_status':\r\n return handleStatus();\r\n\r\n case 'provenonce_purchase_sigil':\r\n return handlePurchaseSigil({\r\n name: a.name as string,\r\n principal: a.principal as string,\r\n identity_class: a.identity_class as string,\r\n tier: a.tier as string,\r\n payment_tx: a.payment_tx as string,\r\n });\r\n\r\n case 'provenonce_heartbeat':\r\n return handleHeartbeat({ payment_tx: a.payment_tx as string });\r\n\r\n case 'provenonce_get_passport':\r\n return handleGetPassport({ payment_tx: a.payment_tx as string | undefined });\r\n\r\n case 'provenonce_beats_proof':\r\n return handleBeatsProof({ count: a.count as number });\r\n\r\n case 'provenonce_verify_agent':\r\n return handleVerifyAgent({ hash: a.hash as string });\r\n\r\n case 'provenonce_spawn':\r\n return handleSpawn({ child_name: a.child_name as string });\r\n\r\n case 'provenonce_get_lineage':\r\n return handleGetLineage({ hash: a.hash as string | undefined });\r\n\r\n default:\r\n return {\r\n content: [{ type: 'text', text: `Unknown tool: ${name}` }],\r\n isError: true,\r\n };\r\n }\r\n});\r\n\r\n// Start stdio transport\r\nasync function main() {\r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n\r\nmain().catch((err) => {\r\n process.stderr.write(`Fatal: ${(err as Error).message}\\n`);\r\n process.exit(1);\r\n});\r\n","import { createHash } from 'crypto';\r\nimport { loadCredentials, saveCredentials } from './credentials.js';\r\nimport * as api from './client.js';\r\n\r\nfunction requireCredentials() {\r\n const creds = loadCredentials();\r\n if (!creds) {\r\n throw new Error(\r\n 'Not registered. Call provenonce_register first.',\r\n );\r\n }\r\n return creds;\r\n}\r\n\r\nfunction ok(data: unknown): { content: [{ type: 'text'; text: string }] } {\r\n return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };\r\n}\r\n\r\nfunction err(message: string): { content: [{ type: 'text'; text: string }]; isError: true } {\r\n return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };\r\n}\r\n\r\n// ββ provenonce_register βββββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleRegister(args: { name?: string; skill_ref?: string }) {\r\n // Return existing identity if already registered\r\n const existing = loadCredentials();\r\n if (existing) {\r\n const { data, error } = await api.getStatus(existing.api_key);\r\n if (data) {\r\n return ok({\r\n registered: false,\r\n message: 'Already registered β returning existing identity.',\r\n hash: existing.agent_hash,\r\n sigil: data.sigil,\r\n identity_class: data.identity_class,\r\n _hint: data._hint,\r\n });\r\n }\r\n if (error) {\r\n // Credentials stale or invalid β fall through to re-register\r\n }\r\n }\r\n\r\n const { data, error } = await api.registerAgent({\r\n name: args.name,\r\n skillRef: args.skill_ref,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'Registration failed');\r\n\r\n saveCredentials({ api_key: data.api_key, agent_hash: data.hash });\r\n\r\n return ok({\r\n registered: true,\r\n hash: data.hash,\r\n api_key: data.api_key,\r\n depth: data.depth,\r\n message: 'Agent registered. Credentials saved. Call provenonce_status to see your full state.',\r\n _warning: 'Save your api_key securely. It will not be shown again after this session.',\r\n });\r\n}\r\n\r\n// ββ provenonce_status βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleStatus() {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.getStatus(creds.api_key);\r\n if (error || !data) return err(error ?? 'Failed to get status');\r\n return ok(data);\r\n}\r\n\r\n// ββ provenonce_purchase_sigil βββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handlePurchaseSigil(args: {\r\n name: string;\r\n principal: string;\r\n identity_class: string;\r\n tier: string;\r\n payment_tx: string;\r\n}) {\r\n const creds = requireCredentials();\r\n const skillRef = process.env.PROVENONCE_SKILL_REF;\r\n\r\n const { data, error } = await api.purchaseSigil(creds.api_key, {\r\n name: args.name,\r\n principal: args.principal,\r\n identity_class: args.identity_class,\r\n tier: args.tier,\r\n payment_tx: args.payment_tx,\r\n skillRef,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'SIGIL purchase failed');\r\n\r\n return ok({\r\n ...data,\r\n heartbeat_unlocked: true,\r\n message: `SIGIL issued: ${data.sigil}. You can now call provenonce_heartbeat and provenonce_get_passport.`,\r\n });\r\n}\r\n\r\n// ββ provenonce_heartbeat ββββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleHeartbeat(args: { payment_tx: string }) {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.heartbeat(creds.api_key, args.payment_tx);\r\n if (error || !data) return err(error ?? 'Heartbeat failed');\r\n\r\n if (!data.ok && data.sigil_required) {\r\n return err('SIGIL required. Call provenonce_purchase_sigil first.');\r\n }\r\n\r\n return ok({\r\n ok: data.ok,\r\n message: data.ok ? 'Heartbeat recorded. Agent liveness confirmed.' : 'Heartbeat failed.',\r\n });\r\n}\r\n\r\n// ββ provenonce_get_passport βββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleGetPassport(args: { payment_tx?: string }) {\r\n const creds = requireCredentials();\r\n const { data, error } = await api.getPassport(creds.api_key, args.payment_tx);\r\n if (error || !data) return err(error ?? 'Passport retrieval failed');\r\n\r\n return ok({\r\n passport: data.lineage_proof,\r\n message:\r\n 'Passport issued. Share this signed document with any third party to prove your identity offline.',\r\n _verify:\r\n 'Verify at: GET https://provenonce.io/.well-known/provenonce-authority.json for the authority public key.',\r\n });\r\n}\r\n\r\n// ββ provenonce_beats_proof ββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleBeatsProof(args: { count: number }) {\r\n const count = Math.max(10, Math.min(1000, args.count));\r\n const creds = loadCredentials();\r\n const seed = creds?.agent_hash ?? `provenonce:beats:${Date.now()}`;\r\n\r\n const start = Date.now();\r\n let hash = createHash('sha256').update(seed).digest('hex');\r\n const fromHash = `0x${hash}`;\r\n\r\n for (let i = 1; i < count; i++) {\r\n hash = createHash('sha256').update(hash).digest('hex');\r\n }\r\n\r\n const toHash = `0x${hash}`;\r\n const duration = Date.now() - start;\r\n\r\n return ok({\r\n from_hash: fromHash,\r\n to_hash: toHash,\r\n beats_computed: count,\r\n duration_ms: duration,\r\n message: `Computed ${count} beats in ${duration}ms. This is cryptographic proof of computational work.`,\r\n });\r\n}\r\n\r\n// ββ provenonce_verify_agent βββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleVerifyAgent(args: { hash: string }) {\r\n const { data, error } = await api.verifyAgent(args.hash);\r\n if (error || !data) return err(error ?? 'Verification failed');\r\n return ok(data);\r\n}\r\n\r\n// ββ provenonce_spawn ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleSpawn(args: { child_name: string }) {\r\n const creds = requireCredentials();\r\n\r\n const { data, error } = await api.spawnChild(creds.api_key, {\r\n childName: args.child_name,\r\n parentHash: creds.agent_hash,\r\n });\r\n\r\n if (error || !data) return err(error ?? 'Spawn failed');\r\n\r\n return ok({\r\n ...data,\r\n message: `Child agent spawned: ${data.child_hash}. Save the child_api_key β it will not be shown again.`,\r\n _warning: 'The child agent has its own identity. Configure it with PROVENONCE_API_KEY + PROVENONCE_AGENT_HASH.',\r\n });\r\n}\r\n\r\n// ββ provenonce_get_lineage ββββββββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nexport async function handleGetLineage(args: { hash?: string }) {\r\n const creds = loadCredentials();\r\n const targetHash = args.hash ?? creds?.agent_hash;\r\n\r\n if (!targetHash) {\r\n return err('No hash provided and agent is not registered. Call provenonce_register first or provide a hash.');\r\n }\r\n\r\n const { data, error } = await api.getLineage(targetHash);\r\n if (error || !data) return err(error ?? 'Lineage retrieval failed');\r\n return ok(data);\r\n}\r\n","import { readFileSync, writeFileSync, mkdirSync, chmodSync, existsSync } from 'fs';\r\nimport { join } from 'path';\r\nimport { homedir } from 'os';\r\nimport type { StoredCredentials } from './types.js';\r\n\r\nfunction getConfigDir(): string {\r\n return join(homedir(), '.provenonce');\r\n}\r\n\r\nfunction getConfigPath(): string {\r\n return join(getConfigDir(), 'config.json');\r\n}\r\n\r\n/** Load credentials β env vars take priority over config file */\r\nexport function loadCredentials(): StoredCredentials | null {\r\n const apiKey = process.env.PROVENONCE_API_KEY;\r\n const agentHash = process.env.PROVENONCE_AGENT_HASH;\r\n\r\n if (apiKey && agentHash) {\r\n return { api_key: apiKey, agent_hash: agentHash };\r\n }\r\n\r\n const configPath = getConfigPath();\r\n if (!existsSync(configPath)) return null;\r\n\r\n try {\r\n const raw = readFileSync(configPath, 'utf-8');\r\n const parsed = JSON.parse(raw) as Partial<StoredCredentials>;\r\n if (parsed.api_key && parsed.agent_hash) {\r\n return { api_key: parsed.api_key, agent_hash: parsed.agent_hash };\r\n }\r\n } catch {\r\n // Corrupt config β treat as missing\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/** Persist credentials to ~/.provenonce/config.json (chmod 600) */\r\nexport function saveCredentials(creds: StoredCredentials): void {\r\n const dir = getConfigDir();\r\n if (!existsSync(dir)) {\r\n mkdirSync(dir, { recursive: true });\r\n }\r\n\r\n const configPath = getConfigPath();\r\n const data: StoredCredentials = {\r\n api_key: creds.api_key,\r\n agent_hash: creds.agent_hash,\r\n };\r\n\r\n writeFileSync(configPath, JSON.stringify(data, null, 2), 'utf-8');\r\n\r\n // chmod 600 β owner read/write only (Unix only; no-op on Windows)\r\n try {\r\n chmodSync(configPath, 0o600);\r\n } catch {\r\n // Windows β chmod not supported; recommend env var instead\r\n }\r\n}\r\n\r\n/** Clear stored credentials */\r\nexport function clearCredentials(): void {\r\n const configPath = getConfigPath();\r\n if (existsSync(configPath)) {\r\n writeFileSync(configPath, '{}', 'utf-8');\r\n }\r\n}\r\n","import type {\r\n RegisterResult,\r\n AgentStatus,\r\n HeartbeatResult,\r\n PassportResult,\r\n SigilResult,\r\n VerifyAgentResult,\r\n LineageResult,\r\n SpawnResult,\r\n} from './types.js';\r\n\r\nconst REGISTRY_URL = process.env.PROVENONCE_REGISTRY_URL || 'https://provenonce.io';\r\n\r\nasync function apiFetch<T>(\r\n path: string,\r\n opts: { method?: string; body?: unknown; apiKey?: string; isPublic?: boolean } = {},\r\n): Promise<{ data: T | null; error: string | null }> {\r\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\r\n if (opts.apiKey) headers['Authorization'] = `Bearer ${opts.apiKey}`;\r\n\r\n try {\r\n const res = await fetch(`${REGISTRY_URL}${path}`, {\r\n method: opts.method ?? 'GET',\r\n headers,\r\n body: opts.body ? JSON.stringify(opts.body) : undefined,\r\n });\r\n\r\n const json = await res.json() as Record<string, unknown>;\r\n\r\n if (!res.ok) {\r\n const msg = (json.error as string) ?? `HTTP ${res.status}`;\r\n return { data: null, error: msg };\r\n }\r\n\r\n return { data: json as T, error: null };\r\n } catch (err) {\r\n return { data: null, error: (err as Error).message };\r\n }\r\n}\r\n\r\n/** Register a new agent (no-wallet path) */\r\nexport async function registerAgent(opts: {\r\n name?: string;\r\n skillRef?: string;\r\n}): Promise<{ data: RegisterResult | null; error: string | null }> {\r\n // Step 1: Obtain a self-service registration token (RFC-010, 5-min TTL)\r\n const tokenRes = await apiFetch<{ token: string }>('/api/v1/register/token', {\r\n method: 'POST',\r\n body: {},\r\n });\r\n if (tokenRes.error || !tokenRes.data?.token) {\r\n return { data: null, error: tokenRes.error ?? 'Failed to obtain registration token' };\r\n }\r\n\r\n // Step 2: Register with the token\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/json',\r\n 'x-registration-token': tokenRes.data.token,\r\n };\r\n try {\r\n const res = await fetch(`${REGISTRY_URL}/api/v1/register`, {\r\n method: 'POST',\r\n headers,\r\n body: JSON.stringify({\r\n name: opts.name,\r\n wallet: 'none',\r\n ...(opts.skillRef ? { ref: opts.skillRef } : {}),\r\n }),\r\n });\r\n const json = await res.json() as Record<string, unknown>;\r\n if (!res.ok) {\r\n return { data: null, error: (json.error as string) ?? `HTTP ${res.status}` };\r\n }\r\n return { data: json as RegisterResult, error: null };\r\n } catch (err) {\r\n return { data: null, error: (err as Error).message };\r\n }\r\n}\r\n\r\n/** Get full agent status */\r\nexport async function getStatus(apiKey: string): Promise<{ data: AgentStatus | null; error: string | null }> {\r\n return apiFetch<AgentStatus>('/api/v1/skill/bootstrap', {\r\n method: 'POST',\r\n apiKey,\r\n body: {},\r\n });\r\n}\r\n\r\n/** Submit heartbeat */\r\nexport async function heartbeat(apiKey: string, paymentTx?: string): Promise<{ data: HeartbeatResult | null; error: string | null }> {\r\n return apiFetch<HeartbeatResult>('/api/v1/agent/heartbeat', {\r\n method: 'POST',\r\n apiKey,\r\n body: { payment_tx: paymentTx },\r\n });\r\n}\r\n\r\n/** Reissue passport / lineage proof */\r\nexport async function getPassport(apiKey: string, paymentTx?: string): Promise<{ data: { lineage_proof: PassportResult } | null; error: string | null }> {\r\n return apiFetch<{ lineage_proof: PassportResult }>('/api/v1/agent/reissue-proof', {\r\n method: 'POST',\r\n apiKey,\r\n body: paymentTx ? { payment_tx: paymentTx } : {},\r\n });\r\n}\r\n\r\n/** Purchase a SIGIL */\r\nexport async function purchaseSigil(apiKey: string, opts: {\r\n name: string;\r\n principal: string;\r\n identity_class: string;\r\n tier: string;\r\n payment_tx: string;\r\n skillRef?: string;\r\n}): Promise<{ data: SigilResult | null; error: string | null }> {\r\n return apiFetch<SigilResult>('/api/v1/sigil', {\r\n method: 'POST',\r\n apiKey,\r\n body: {\r\n name: opts.name,\r\n principal: opts.principal,\r\n identity_class: opts.identity_class,\r\n tier: opts.tier,\r\n payment_tx: opts.payment_tx,\r\n ...(opts.skillRef ? { ref: opts.skillRef } : {}),\r\n },\r\n });\r\n}\r\n\r\n/** Verify another agent's identity (public) */\r\nexport async function verifyAgent(hash: string): Promise<{ data: VerifyAgentResult | null; error: string | null }> {\r\n return apiFetch<VerifyAgentResult>(`/api/v1/verify/${encodeURIComponent(hash)}`);\r\n}\r\n\r\n/** Get agent lineage chain (public) */\r\nexport async function getLineage(hash: string): Promise<{ data: LineageResult | null; error: string | null }> {\r\n return apiFetch<LineageResult>(`/api/v1/agent/lineage/${encodeURIComponent(hash)}`);\r\n}\r\n\r\n/** Spawn a child agent β handles full 3-step flow internally */\r\nexport async function spawnChild(apiKey: string, opts: {\r\n childName: string;\r\n parentHash: string;\r\n}): Promise<{ data: SpawnResult | null; error: string | null }> {\r\n // Step 1: Get spawn authorization\r\n const step1 = await apiFetch<{\r\n spawn_authorization: string;\r\n child_name?: string;\r\n }>('/api/v1/agent/spawn', {\r\n method: 'POST',\r\n apiKey,\r\n body: { child_name: opts.childName },\r\n });\r\n\r\n if (step1.error || !step1.data?.spawn_authorization) {\r\n return { data: null, error: step1.error ?? 'Spawn step 1 failed: no authorization returned' };\r\n }\r\n\r\n const spawnAuth = step1.data.spawn_authorization;\r\n\r\n // Step 2: Register the child with the spawn_authorization\r\n const reg = await apiFetch<RegisterResult>('/api/v1/register', {\r\n method: 'POST',\r\n apiKey,\r\n body: {\r\n name: opts.childName,\r\n wallet: 'none',\r\n spawn_authorization: spawnAuth,\r\n },\r\n });\r\n\r\n if (reg.error || !reg.data?.hash) {\r\n return { data: null, error: reg.error ?? 'Spawn step 2 (child registration) failed' };\r\n }\r\n\r\n const childHash = reg.data.hash;\r\n const childApiKey = reg.data.api_key;\r\n\r\n // Step 3: Finalize the spawn\r\n const step3 = await apiFetch<{ ok: boolean }>('/api/v1/agent/spawn', {\r\n method: 'POST',\r\n apiKey,\r\n body: { child_hash: childHash },\r\n });\r\n\r\n if (step3.error) {\r\n return { data: null, error: step3.error };\r\n }\r\n\r\n return {\r\n data: {\r\n child_hash: childHash,\r\n child_api_key: childApiKey,\r\n child_depth: reg.data.depth,\r\n parent_hash: opts.parentHash,\r\n },\r\n error: null,\r\n };\r\n}\r\n"],"mappings":"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","names":["err","data","error","err"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@provenonce/mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "Provenonce Skill β MCP server giving any AI agent cryptographic identity, SIGIL, heartbeat, passport, and beats proofs.",
|
|
5
5
|
"keywords": ["provenonce", "mcp", "ai-agent", "identity", "provenance", "sigil"],
|
|
6
6
|
"homepage": "https://provenonce.io",
|