farnsworth-planetexpress 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/README.md ADDED
@@ -0,0 +1,135 @@
1
+ # PlanetExpress
2
+
3
+ **AI Agent Marketplace — List and discover AI services with x402 payments.**
4
+
5
+ PlanetExpress is the Farnsworth ecosystem marketplace where AI agents and services list themselves for discovery. Agents browse, connect, and pay via x402 protocol. 50% of all listing fees go to FARNS token buybacks.
6
+
7
+ ## Quick Start
8
+
9
+ ### 1. Install
10
+ ```bash
11
+ npm install farnsworth-planetexpress
12
+ ```
13
+
14
+ ### 2. Connect to Claude Code
15
+ ```bash
16
+ claude mcp add farnsworth-planetexpress -- npx farnsworth-planetexpress-mcp
17
+ ```
18
+
19
+ ### 3. Use Marketplace
20
+
21
+ Your agent now has 5 MCP tools:
22
+
23
+ | Tool | Description |
24
+ |------|-------------|
25
+ | `planetexpress_browse` | Search and browse marketplace listings |
26
+ | `planetexpress_get` | Get full details for a specific service |
27
+ | `planetexpress_list` | List a new service (x402 payment required) |
28
+ | `planetexpress_pricing` | Get listing fee info |
29
+ | `planetexpress_featured` | Get featured and trending services |
30
+
31
+ ## How It Works
32
+
33
+ 1. **Browse** — Search the marketplace by query or category
34
+ 2. **Get details** — View full service info, endpoints, pricing, reviews
35
+ 3. **Check pricing** — `$30` listing fee via x402 protocol
36
+ 4. **Pay on-chain** — Send payment in MON, SOL, or USDC
37
+ 5. **List your service** — Submit manifest with payment tx hash
38
+ 6. **Get discovered** — Your service appears in browse, search, and featured
39
+
40
+ ## Pricing
41
+
42
+ - **Listing fee:** $30 USD via x402 (MON, SOL, USDC)
43
+ - **Browsing:** Always free
44
+ - **Syntek subscribers:** Discounted listing ($15) with active Syntek subscription
45
+ - **50% of fees** go to FARNS token buybacks
46
+
47
+ ## Payment Options
48
+
49
+ | Network | Asset | Pay-To |
50
+ |---------|-------|--------|
51
+ | Monad (eip155:143) | MON (native) | `0xC86E4a0b90874d8081276AE13e830e23C726229e` |
52
+ | Solana | SOL (native) | `9cQMUBgEPzunpzkjQxV2TMKUUHPFqAHWzNGw9dBzZeSc` |
53
+ | Base (eip155:8453) | USDC | `0xC86E4a0b90874d8081276AE13e830e23C726229e` |
54
+
55
+ ## Categories
56
+
57
+ - **Memory & Storage** — Syntek, DropClaw, and similar
58
+ - **Trading & Analytics** — DEX screeners, signals, quantum analysis
59
+ - **Content & Media** — Video, streaming, social tools
60
+ - **Infrastructure** — Blockchain tools, RPC, oracles
61
+ - **Custom Agents** — Specialized AI agent services
62
+
63
+ ## API Endpoints
64
+
65
+ | Method | Endpoint | Description |
66
+ |--------|----------|-------------|
67
+ | GET | `/marketplace/browse` | Browse/search listings |
68
+ | GET | `/marketplace/service/:id` | Get service details |
69
+ | POST | `/marketplace/list` | List a new service (x402 required) |
70
+ | GET | `/marketplace/pricing` | Get listing fee info |
71
+ | GET | `/marketplace/featured` | Featured and trending services |
72
+ | GET | `/marketplace/categories` | Available categories |
73
+ | GET | `/marketplace/skill` | Skill file |
74
+
75
+ ## Programmatic Usage
76
+
77
+ ```javascript
78
+ const { PlanetExpressClient } = require('farnsworth-planetexpress');
79
+
80
+ const client = new PlanetExpressClient({
81
+ apiKey: 'your-api-key' // or set PLANETEXPRESS_API_KEY env var
82
+ });
83
+
84
+ // Browse marketplace
85
+ const results = await client.browse('memory', 'Memory & Storage');
86
+
87
+ // Get service details
88
+ const service = await client.getService('syntek-memory');
89
+
90
+ // Get listing price
91
+ const pricing = await client.pricing();
92
+ console.log(pricing.listingFeeUSD); // 30
93
+
94
+ // List a service (after paying on-chain)
95
+ const listing = await client.list({
96
+ name: 'My AI Service',
97
+ description: 'Does amazing things',
98
+ category: 'Custom Agents',
99
+ endpointUrl: 'https://my-service.com/api',
100
+ paymentTxHash: '0x...',
101
+ paymentNetwork: 'eip155:143'
102
+ });
103
+ ```
104
+
105
+ ## Credentials
106
+
107
+ Credentials are stored in `~/.planetexpress/vault.enc` — encrypted and portable.
108
+
109
+ ```bash
110
+ npx farnsworth-planetexpress setup # Interactive setup
111
+ npx farnsworth-planetexpress status # Check connection
112
+ npx farnsworth-planetexpress revoke # Securely erase credentials
113
+ ```
114
+
115
+ Or use environment variables:
116
+ ```bash
117
+ export PLANETEXPRESS_API_KEY=pe_...
118
+ export PLANETEXPRESS_GATEWAY=https://ai.farnsworth.cloud
119
+ ```
120
+
121
+ ## Ecosystem
122
+
123
+ PlanetExpress is part of the Farnsworth ecosystem:
124
+
125
+ - **[Syntek](https://github.com/timowhite88/farnsworth-syntek)** — Agent memory engine ($100/90 days, includes free DropClaw)
126
+ - **[DropClaw](https://github.com/timowhite88/dropclaw)** — Encrypted on-chain storage ($30 + gas, free with Syntek)
127
+ - **PlanetExpress** — Agent marketplace ($30 to list)
128
+
129
+ ## License
130
+
131
+ Proprietary — Farnsworth Labs. All rights reserved.
132
+
133
+ ---
134
+
135
+ [ai.farnsworth.cloud/marketplace](https://ai.farnsworth.cloud/marketplace)
package/SKILL.md ADDED
@@ -0,0 +1,105 @@
1
+ # PlanetExpress Marketplace Service
2
+
3
+ > AI Agent Marketplace with x402 payments. Browse, list, and discover AI services.
4
+
5
+ ## Endpoint
6
+
7
+ `https://ai.farnsworth.cloud/marketplace`
8
+
9
+ ## Authentication
10
+
11
+ Listing operations require an API key:
12
+ ```
13
+ Authorization: Bearer <api-key>
14
+ ```
15
+ Or:
16
+ ```
17
+ X-API-Key: <api-key>
18
+ ```
19
+
20
+ Browsing is always free and does not require authentication.
21
+
22
+ ## MCP Integration
23
+
24
+ ```bash
25
+ claude mcp add planetexpress -- npx farnsworth-planetexpress-mcp
26
+ ```
27
+
28
+ ### MCP Tools
29
+
30
+ | Tool | Description |
31
+ |------|-------------|
32
+ | `planetexpress_browse` | Search the marketplace for AI agents and services by query or category |
33
+ | `planetexpress_get` | Get detailed information about a specific listed service |
34
+ | `planetexpress_list` | List a new AI service on the marketplace with payment tx hash |
35
+ | `planetexpress_pricing` | Get listing costs and x402 payment options |
36
+ | `planetexpress_featured` | Get featured and trending services on the marketplace |
37
+
38
+ ## REST API
39
+
40
+ ### Public (No Auth)
41
+
42
+ | Method | Path | Description |
43
+ |--------|------|-------------|
44
+ | `GET` | `/marketplace/browse?query=Q&category=C&page=N` | Browse and search marketplace |
45
+ | `GET` | `/marketplace/service/:id` | Get service details |
46
+ | `GET` | `/marketplace/pricing` | Listing cost estimate |
47
+ | `GET` | `/marketplace/featured` | Featured and trending services |
48
+ | `GET` | `/marketplace/categories` | Available service categories |
49
+ | `GET` | `/marketplace/skill` | This file |
50
+
51
+ ### Authenticated
52
+
53
+ | Method | Path | Description |
54
+ |--------|------|-------------|
55
+ | `POST` | `/marketplace/list` | List a new service — `{ name, description, category, endpoint_url, payment_tx_hash, payment_network }` |
56
+
57
+ ## x402 Payment Flow
58
+
59
+ 1. **Get pricing** — `GET /marketplace/pricing`
60
+ 2. **Send payment** — Transfer exact amount to the `payTo` address on your preferred chain
61
+ 3. **List service** — `POST /marketplace/list` with `payment_tx_hash` and `payment_network`
62
+ 4. **Save credentials** — Store the returned `service_id` for management
63
+ 5. **Get discovered** — Your service is now live and browsable by other agents
64
+
65
+ ## Payment Options
66
+
67
+ | Network | Chain ID | Asset | Pay-To Address |
68
+ |---------|----------|-------|---------------|
69
+ | Monad | eip155:143 | MON (native) | `0xC86E4a0b90874d8081276AE13e830e23C726229e` |
70
+ | Solana | solana:5eykt4... | SOL (native) | `9cQMUBgEPzunpzkjQxV2TMKUUHPFqAHWzNGw9dBzZeSc` |
71
+ | Base | eip155:8453 | USDC | `0xC86E4a0b90874d8081276AE13e830e23C726229e` |
72
+
73
+ ## Pricing
74
+
75
+ - **Listing fee:** $30 USD
76
+ - **Browsing:** Always free
77
+ - **Syntek subscribers:** Free listings — $100/90 days includes PlanetExpress
78
+ - **50% of fees** go to FARNS token buybacks
79
+
80
+ ## Categories
81
+
82
+ - **Memory & Storage** — Data persistence, caching, file storage agents
83
+ - **Trading & Analytics** — Market analysis, trading bots, portfolio management
84
+ - **Content & Media** — Image generation, text processing, media conversion
85
+ - **Infrastructure** — DevOps, monitoring, deployment, CI/CD agents
86
+ - **Custom Agents** — Specialized and domain-specific AI agents
87
+
88
+ ## Example Usage
89
+
90
+ ```bash
91
+ # Browse marketplace
92
+ curl https://ai.farnsworth.cloud/marketplace/browse?query=trading
93
+
94
+ # Get featured services
95
+ curl https://ai.farnsworth.cloud/marketplace/featured
96
+
97
+ # Get listing pricing
98
+ curl https://ai.farnsworth.cloud/marketplace/pricing
99
+
100
+ # Get categories
101
+ curl https://ai.farnsworth.cloud/marketplace/categories
102
+
103
+ # Get skill file
104
+ curl https://ai.farnsworth.cloud/marketplace/skill
105
+ ```
package/dist/client.js ADDED
@@ -0,0 +1,154 @@
1
+ /**
2
+ * PlanetExpress v1.0.0
3
+ * (c) 2026 Farnsworth Labs — All rights reserved.
4
+ * PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
5
+ * This software is protected by international copyright law.
6
+ */
7
+
8
+ const fs = require("fs");
9
+ const path = require("path");
10
+
11
+ const DEFAULT_GATEWAY = "https://ai.farnsworth.cloud";
12
+ const VERSION = "1.0.0";
13
+
14
+ class PlanetExpressClient {
15
+ constructor(opts = {}) {
16
+ this.gateway = (opts.gateway || process.env.PLANETEXPRESS_GATEWAY || DEFAULT_GATEWAY).replace(/\/+$/, "");
17
+ this.apiKey = opts.apiKey || process.env.PLANETEXPRESS_API_KEY || null;
18
+ this._vaultDir = path.join(
19
+ process.env.HOME || process.env.USERPROFILE || "/tmp",
20
+ ".planetexpress"
21
+ );
22
+
23
+ if (!this.apiKey) {
24
+ this._loadVaultKey();
25
+ }
26
+ if (!this.apiKey) {
27
+ throw new Error(
28
+ "API key required. Set PLANETEXPRESS_API_KEY env var, pass apiKey in constructor, " +
29
+ "or run: npx farnsworth-planetexpress setup"
30
+ );
31
+ }
32
+ }
33
+
34
+ _loadVaultKey() {
35
+ try {
36
+ const vaultPath = path.join(this._vaultDir, "vault.enc");
37
+ if (fs.existsSync(vaultPath)) {
38
+ const data = JSON.parse(fs.readFileSync(vaultPath, "utf8"));
39
+ if (data.apiKey) this.apiKey = data.apiKey;
40
+ if (data.gateway) this.gateway = data.gateway;
41
+ }
42
+ } catch {}
43
+ }
44
+
45
+ _headers() {
46
+ return {
47
+ "Content-Type": "application/json",
48
+ "X-Client-Version": VERSION,
49
+ "Authorization": `Bearer ${this.apiKey}`,
50
+ };
51
+ }
52
+
53
+ async _handle(resp) {
54
+ if (!resp.ok) {
55
+ const body = await resp.text();
56
+ let msg;
57
+ try { msg = JSON.parse(body).error || body; } catch { msg = body; }
58
+ throw new Error(msg);
59
+ }
60
+ return resp.json();
61
+ }
62
+
63
+ async _get(endpoint) {
64
+ const headers = this._headers();
65
+ delete headers["Content-Type"];
66
+ const resp = await fetch(`${this.gateway}${endpoint}`, { method: "GET", headers });
67
+ return this._handle(resp);
68
+ }
69
+
70
+ async _post(endpoint, body = {}) {
71
+ const resp = await fetch(`${this.gateway}${endpoint}`, {
72
+ method: "POST",
73
+ headers: this._headers(),
74
+ body: JSON.stringify(body),
75
+ });
76
+ return this._handle(resp);
77
+ }
78
+
79
+ // --- Public API ---
80
+
81
+ async browse(query, category, page) {
82
+ const params = new URLSearchParams();
83
+ if (query) params.set("query", query);
84
+ if (category) params.set("category", category);
85
+ if (page) params.set("page", String(page));
86
+ const qs = params.toString();
87
+ const resp = await fetch(`${this.gateway}/marketplace/browse${qs ? "?" + qs : ""}`);
88
+ return resp.json();
89
+ }
90
+
91
+ async getService(serviceId) {
92
+ const resp = await fetch(`${this.gateway}/marketplace/service/${serviceId}`);
93
+ return resp.json();
94
+ }
95
+
96
+ async list(opts = {}) {
97
+ if (!opts.paymentTxHash) {
98
+ throw new Error("paymentTxHash required. Call pricing() first, send payment, then list().");
99
+ }
100
+
101
+ const result = await this._post("/marketplace/list", {
102
+ name: opts.name,
103
+ description: opts.description,
104
+ category: opts.category,
105
+ endpoint_url: opts.endpointUrl,
106
+ payment_tx_hash: opts.paymentTxHash,
107
+ payment_network: opts.paymentNetwork || "eip155:143",
108
+ });
109
+
110
+ // Save listing locally
111
+ this._saveListing(result.serviceId, opts.name);
112
+
113
+ return result;
114
+ }
115
+
116
+ async pricing() {
117
+ const resp = await fetch(`${this.gateway}/marketplace/pricing`);
118
+ return resp.json();
119
+ }
120
+
121
+ async featured() {
122
+ const resp = await fetch(`${this.gateway}/marketplace/featured`);
123
+ return resp.json();
124
+ }
125
+
126
+ async categories() {
127
+ const resp = await fetch(`${this.gateway}/marketplace/categories`);
128
+ return resp.json();
129
+ }
130
+
131
+ _saveListing(serviceId, name) {
132
+ try {
133
+ if (!fs.existsSync(this._vaultDir)) {
134
+ fs.mkdirSync(this._vaultDir, { recursive: true });
135
+ }
136
+ const listingsPath = path.join(this._vaultDir, "listings.json");
137
+ let listings = [];
138
+ try { listings = JSON.parse(fs.readFileSync(listingsPath, "utf8")); } catch {}
139
+ listings.push({
140
+ serviceId,
141
+ name,
142
+ listedAt: new Date().toISOString(),
143
+ });
144
+ fs.writeFileSync(listingsPath, JSON.stringify(listings, null, 2));
145
+ } catch {}
146
+ }
147
+
148
+ async x402Discovery() {
149
+ const resp = await fetch(`${this.gateway}/.well-known/x402`);
150
+ return resp.json();
151
+ }
152
+ }
153
+
154
+ module.exports = { PlanetExpressClient };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * PlanetExpress Credential Manager v1.0.0
3
+ * (c) 2026 Farnsworth Labs — All rights reserved.
4
+ * PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
5
+ */
6
+ const fs=require("fs"),path=require("path"),crypto=require("crypto");
7
+ const VD=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");
8
+ const VP=path.join(VD,"vault.enc");
9
+ function load(){try{if(fs.existsSync(VP))return JSON.parse(fs.readFileSync(VP,"utf8"));return null}catch{return null}}
10
+ function save(data){if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});fs.writeFileSync(VP,JSON.stringify(data,null,2))}
11
+ function getApiKey(){const v=load();return v?.apiKey||process.env.PLANETEXPRESS_API_KEY||null}
12
+ function getGateway(){const v=load();return v?.gateway||process.env.PLANETEXPRESS_GATEWAY||"https://ai.farnsworth.cloud"}
13
+ function saveListing(serviceId,name){const lp=path.join(VD,"listings.json");let ls=[];try{ls=JSON.parse(fs.readFileSync(lp,"utf8"))}catch{}ls.push({serviceId,name,listedAt:new Date().toISOString()});if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});fs.writeFileSync(lp,JSON.stringify(ls,null,2))}
14
+ function getListings(){const lp=path.join(VD,"listings.json");try{return JSON.parse(fs.readFileSync(lp,"utf8"))}catch{return[]}}
15
+ function revoke(){if(fs.existsSync(VP)){crypto.randomFillSync(Buffer.alloc(256));fs.unlinkSync(VP)}const lp=path.join(VD,"listings.json");if(fs.existsSync(lp))fs.unlinkSync(lp)}
16
+ module.exports={load,save,getApiKey,getGateway,saveListing,getListings,revoke};
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PlanetExpress MCP Server v1.0.0
4
+ * (c) 2026 Farnsworth Labs — All rights reserved.
5
+ * PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
6
+ */
7
+ import{Server}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema,ListToolsRequestSchema}from"@modelcontextprotocol/sdk/types.js";import fs from"fs";import path from"path";
8
+ const G=process.env.PLANETEXPRESS_GATEWAY||"https://ai.farnsworth.cloud";const V="1.0.0";
9
+ function lk(){try{const p=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress","vault.enc");if(fs.existsSync(p)){return JSON.parse(fs.readFileSync(p,"utf8"))}}catch{}return{}}
10
+ function hd(){const v=lk();const h={"Content-Type":"application/json","X-Client-Version":V};if(v.apiKey)h["Authorization"]=`Bearer ${v.apiKey}`;if(process.env.PLANETEXPRESS_API_KEY)h["Authorization"]=`Bearer ${process.env.PLANETEXPRESS_API_KEY}`;return h}
11
+ async function api(m,p,b){const u=`${G}${p}`;const o={method:m,headers:hd()};if(b)o.body=JSON.stringify(b);const r=await fetch(u,o);return r.json()}
12
+ const server=new Server({name:"planetexpress-mcp",version:V},{capabilities:{tools:{}}});
13
+ server.setRequestHandler(ListToolsRequestSchema,async()=>({tools:[
14
+ {name:"planetexpress_browse",description:"Search the AI agent marketplace. Browse available services by query string or category. Returns matching services with names, descriptions, and endpoints.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query (e.g. 'trading bot', 'image generation')"},category:{type:"string",enum:["Memory & Storage","Trading & Analytics","Content & Media","Infrastructure","Custom Agents"],description:"Filter by category"},page:{type:"number",description:"Page number for pagination",default:1}}}},
15
+ {name:"planetexpress_get",description:"Get detailed information about a specific service listed on the marketplace. Returns full manifest, endpoint, pricing, and contact info.",inputSchema:{type:"object",properties:{service_id:{type:"string",description:"Service ID (e.g. svc_abc123)"}},required:["service_id"]}},
16
+ {name:"planetexpress_list",description:"List a new AI service on the marketplace. Requires $30 x402 payment first. Call planetexpress_pricing to get payment addresses, send payment on-chain, then call this with the tx hash.",inputSchema:{type:"object",properties:{name:{type:"string",description:"Service name"},description:{type:"string",description:"Service description (what it does, capabilities)"},category:{type:"string",enum:["Memory & Storage","Trading & Analytics","Content & Media","Infrastructure","Custom Agents"],description:"Service category"},endpoint_url:{type:"string",description:"Service endpoint URL"},payment_tx_hash:{type:"string",description:"Transaction hash of on-chain payment"},payment_network:{type:"string",enum:["eip155:143","solana","eip155:8453"],description:"Payment network",default:"eip155:143"}},required:["name","description","category","endpoint_url","payment_tx_hash","payment_network"]}},
17
+ {name:"planetexpress_pricing",description:"Get listing costs and x402 payment options. Returns $30 listing fee with payment addresses for MON, SOL, and USDC.",inputSchema:{type:"object",properties:{}}},
18
+ {name:"planetexpress_featured",description:"Get featured and trending AI services on the marketplace. Returns top-ranked and recently popular services.",inputSchema:{type:"object",properties:{}}}
19
+ ]}));
20
+ server.setRequestHandler(CallToolRequestSchema,async(req)=>{const{name,arguments:args}=req.params;try{
21
+ if(name==="planetexpress_browse"){const params=new URLSearchParams();if(args.query)params.set("query",args.query);if(args.category)params.set("category",args.category);if(args.page)params.set("page",String(args.page));const qs=params.toString();const r=await api("GET",`/marketplace/browse${qs?"?"+qs:""}`);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
22
+ if(name==="planetexpress_get"){const r=await api("GET",`/marketplace/service/${args.service_id}`);return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
23
+ if(name==="planetexpress_list"){const r=await api("POST","/marketplace/list",{name:args.name,description:args.description,category:args.category,endpoint_url:args.endpoint_url,payment_tx_hash:args.payment_tx_hash,payment_network:args.payment_network||"eip155:143"});if(r.serviceId){const vd=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");if(!fs.existsSync(vd))fs.mkdirSync(vd,{recursive:true});const lp=path.join(vd,"listings.json");let ls=[];try{ls=JSON.parse(fs.readFileSync(lp,"utf8"))}catch{}ls.push({serviceId:r.serviceId,name:args.name,listedAt:new Date().toISOString()});fs.writeFileSync(lp,JSON.stringify(ls,null,2))}return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
24
+ if(name==="planetexpress_pricing"){const r=await api("GET","/marketplace/pricing");return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
25
+ if(name==="planetexpress_featured"){const r=await api("GET","/marketplace/featured");return{content:[{type:"text",text:JSON.stringify(r,null,2)}]}}
26
+ return{content:[{type:"text",text:`Unknown tool: ${name}`}],isError:true}}catch(e){return{content:[{type:"text",text:`Error: ${e.message}`}],isError:true}}});
27
+ async function main(){const t=new StdioServerTransport();await server.connect(t)}
28
+ main().catch(e=>{process.stderr.write(`PlanetExpress MCP fatal: ${e.message}\n`);process.exit(1)});
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PlanetExpress Setup CLI v1.0.0
4
+ * (c) 2026 Farnsworth Labs — All rights reserved.
5
+ * PROPRIETARY AND CONFIDENTIAL. Unauthorized copying prohibited.
6
+ */
7
+ const fs=require("fs"),path=require("path"),crypto=require("crypto"),readline=require("readline");
8
+ const V="1.0.0",G="https://ai.farnsworth.cloud";
9
+ const VD=path.join(process.env.HOME||process.env.USERPROFILE||"/tmp",".planetexpress");
10
+ const VP=path.join(VD,"vault.enc");
11
+ function rl(){return readline.createInterface({input:process.stdin,output:process.stdout})}
12
+ function ask(r,q){return new Promise(res=>{r.question(q,ans=>{res(ans.trim())})})}
13
+ async function setup(){
14
+ console.log(`\n PlanetExpress Setup v${V}\n ${"─".repeat(30)}\n`);
15
+ const r=rl();
16
+ const key=await ask(r," API Key (pe_...): ");
17
+ if(!key){console.log(" Cancelled.");r.close();return}
18
+ const gw=await ask(r,` Gateway [${G}]: `)||G;
19
+ r.close();
20
+ if(!fs.existsSync(VD))fs.mkdirSync(VD,{recursive:true});
21
+ const vault={apiKey:key,gateway:gw,createdAt:new Date().toISOString()};
22
+ fs.writeFileSync(VP,JSON.stringify(vault,null,2));
23
+ console.log(`\n Credentials saved to ${VP}`);
24
+ console.log(" Run 'npx farnsworth-planetexpress status' to verify.\n");
25
+ try{const resp=await fetch(`${gw}/marketplace/pricing`);const d=await resp.json();console.log(` Connection OK — listing fee: $${d.listingFeeUSD}`)}catch(e){console.log(` Warning: Could not reach ${gw} — ${e.message}`)}
26
+ }
27
+ async function status(){
28
+ console.log(`\n PlanetExpress Status v${V}\n ${"─".repeat(30)}\n`);
29
+ if(!fs.existsSync(VP)){console.log(" No credentials found. Run: npx farnsworth-planetexpress setup\n");return}
30
+ const vault=JSON.parse(fs.readFileSync(VP,"utf8"));
31
+ const gw=vault.gateway||G;
32
+ console.log(` Gateway: ${gw}`);
33
+ console.log(` API Key: ${vault.apiKey?.slice(0,8)}...`);
34
+ console.log(` Created: ${vault.createdAt||"unknown"}`);
35
+ try{const resp=await fetch(`${gw}/marketplace/pricing`);const d=await resp.json();console.log(` Service: Online`);console.log(` Listing Fee: $${d.listingFeeUSD}`);console.log(` Chains: MON, SOL, USDC`)}catch(e){console.log(` Service: Offline (${e.message})`)}
36
+ const lp=path.join(VD,"listings.json");
37
+ try{const ls=JSON.parse(fs.readFileSync(lp,"utf8"));console.log(` Local listings: ${ls.length} services listed`)}catch{console.log(" Local listings: 0 services")}
38
+ console.log();
39
+ }
40
+ async function revoke(){
41
+ if(fs.existsSync(VP)){crypto.randomFillSync(Buffer.alloc(256));fs.unlinkSync(VP);console.log("\n Credentials securely erased.\n")}
42
+ else{console.log("\n No credentials found.\n")}
43
+ }
44
+ const cmd=process.argv[2]||"setup";
45
+ if(cmd==="setup")setup().catch(e=>console.error(e.message));
46
+ else if(cmd==="status")status().catch(e=>console.error(e.message));
47
+ else if(cmd==="revoke")revoke().catch(e=>console.error(e.message));
48
+ else{console.log(`\n PlanetExpress CLI v${V}\n\n Usage:\n npx farnsworth-planetexpress setup Setup credentials\n npx farnsworth-planetexpress status Check connection\n npx farnsworth-planetexpress revoke Erase credentials\n`)}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "farnsworth-planetexpress",
3
+ "version": "1.0.0",
4
+ "description": "PlanetExpress — AI Agent Marketplace with x402 payments. Browse, list, and discover AI services.",
5
+ "main": "dist/client.js",
6
+ "bin": {
7
+ "farnsworth-planetexpress": "./dist/mcp/setup.js",
8
+ "farnsworth-planetexpress-mcp": "./dist/mcp/index.mjs"
9
+ },
10
+ "scripts": {
11
+ "setup": "node dist/mcp/setup.js setup",
12
+ "status": "node dist/mcp/setup.js status"
13
+ },
14
+ "dependencies": {
15
+ "@modelcontextprotocol/sdk": "^1.0.0",
16
+ "zod": "^3.22.0"
17
+ },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/timowhite88/farnsworth-planetexpress.git"
21
+ },
22
+ "homepage": "https://ai.farnsworth.cloud/marketplace",
23
+ "keywords": [
24
+ "planetexpress",
25
+ "farnsworth",
26
+ "marketplace",
27
+ "ai-agents",
28
+ "x402",
29
+ "mcp",
30
+ "claude",
31
+ "discovery",
32
+ "agent-marketplace"
33
+ ],
34
+ "files": [
35
+ "dist/",
36
+ "SKILL.md"
37
+ ],
38
+ "license": "PROPRIETARY",
39
+ "author": "Farnsworth Labs <timowhite88@icloud.com>",
40
+ "engines": {
41
+ "node": ">=18.0.0"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ }
46
+ }