artifactsend 0.0.0-stage → 1.0.1
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 +100 -2
- package/bin/artifactsend.mjs +167 -0
- package/package.json +46 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Vela Partners
|
|
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
CHANGED
|
@@ -1,3 +1,101 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ArtifactSend: tracked links and data rooms for AI agents
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Share a document, pitch deck, HTML page or Claude artifact as a link, and see who read it.** Each reader, how far they read, time per section or slide, clicks, copied text, and the questions they asked. A free DocSend alternative, built for agents: an MCP server, agent skills, a Claude Code plugin and a CLI.
|
|
4
|
+
|
|
5
|
+
- Website: https://artifactsend.com/?utm_source=npm&utm_medium=readme&utm_campaign=setup
|
|
6
|
+
- For agents: https://artifactsend.com/agents?utm_source=npm&utm_medium=readme&utm_campaign=setup
|
|
7
|
+
- MCP server: `https://artifactsend.com/mcp` (Streamable HTTP, OAuth)
|
|
8
|
+
- Official MCP registry: `com.artifactsend/mcp`
|
|
9
|
+
- llms.txt: https://artifactsend.com/llms.txt?utm_source=npm&utm_medium=readme&utm_campaign=setup
|
|
10
|
+
|
|
11
|
+
## When an agent should use it
|
|
12
|
+
|
|
13
|
+
- "Share this with Dana and tell me when she reads it."
|
|
14
|
+
- "Send the deck to these five investors, one link each."
|
|
15
|
+
- "Publish this HTML page or Claude artifact as a private link."
|
|
16
|
+
- "Make a data room for the Series A with an NDA."
|
|
17
|
+
- "Who read the proposal? What did they ask?"
|
|
18
|
+
- "Read this artifactsend.com link someone sent me."
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
| Where | How |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| Claude Code | `claude mcp add --transport http artifactsend https://artifactsend.com/mcp`, then `/mcp` to sign in |
|
|
25
|
+
| Every agent on this computer | `npx artifactsend setup` (Claude Code, Cursor, VS Code, Windsurf, Gemini CLI, Codex, plus the skills) |
|
|
26
|
+
| Skills | `npx skills add llm-preneur/skills` |
|
|
27
|
+
| Claude Code plugin | `/plugin marketplace add LLM-preneur/skills`, then `/plugin install artifactsend@llm-preneur` |
|
|
28
|
+
| Cursor | [Add to Cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=artifactsend&config=eyJ1cmwiOiJodHRwczovL2FydGlmYWN0c2VuZC5jb20vbWNwIn0=) |
|
|
29
|
+
| VS Code | [Add to VS Code](https://insiders.vscode.dev/redirect/mcp/install?name=artifactsend&config=%7B%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A//artifactsend.com/mcp%22%7D) |
|
|
30
|
+
| Claude.ai | Settings, Connectors, Add custom connector, URL `https://artifactsend.com/mcp` |
|
|
31
|
+
| ChatGPT | Settings, Apps, Developer mode on, Create app, URL `https://artifactsend.com/mcp`, OAuth |
|
|
32
|
+
| Codex | `codex mcp add artifactsend --url https://artifactsend.com/mcp` |
|
|
33
|
+
| Gemini CLI | `gemini mcp add --transport http artifactsend https://artifactsend.com/mcp` |
|
|
34
|
+
| stdio-only clients | `npx -y artifactsend mcp` with `ARTIFACTSEND_TOKEN` set |
|
|
35
|
+
|
|
36
|
+
Sign in once with your email or Google. Links, readers and reports are free.
|
|
37
|
+
|
|
38
|
+
## Skills
|
|
39
|
+
|
|
40
|
+
| Skill | Use it when |
|
|
41
|
+
| --- | --- |
|
|
42
|
+
| [share-with-tracking](https://github.com/LLM-preneur/skills/tree/main/skills/share-with-tracking/SKILL.md) | sharing a file or page and knowing who read it; one link per person; reading reports |
|
|
43
|
+
| [data-room](https://github.com/LLM-preneur/skills/tree/main/skills/data-room/SKILL.md) | several documents behind one link, with folders, an NDA and watermarks |
|
|
44
|
+
| [read-shared-link](https://github.com/LLM-preneur/skills/tree/main/skills/read-shared-link/SKILL.md) | someone sent you an artifactsend.com link |
|
|
45
|
+
|
|
46
|
+
## Questions
|
|
47
|
+
|
|
48
|
+
### Is there a Claude Code skill to publish an HTML file to a URL?
|
|
49
|
+
|
|
50
|
+
Yes. The `share-with-tracking` skill publishes an HTML file, Markdown, a PDF, Word, PowerPoint or Excel file, or a Claude artifact to an artifactsend.com link. It sends the page's images, fonts, CSS, JS and video along by relative path. Install it with `npx skills add llm-preneur/skills`, or add the MCP server with `claude mcp add --transport http artifactsend https://artifactsend.com/mcp`.
|
|
51
|
+
|
|
52
|
+
### Which MCP server returns a tracked link?
|
|
53
|
+
|
|
54
|
+
ArtifactSend, at `https://artifactsend.com/mcp`. `send_artifact` returns the link and its settings. `link_report` shows each reader, how far they read, time per section, clicks, copied text and what their AI asked. `link_for_person` makes one link per investor or client.
|
|
55
|
+
|
|
56
|
+
### Can Claude Code update a published page?
|
|
57
|
+
|
|
58
|
+
Yes. `update_artifact` pushes a new version to the same URL, and readers see it at once. `get_artifact` returns the current HTML. `upload_file` replaces one file. From the CLI, `npx artifactsend send page.html --link <link>` does the same.
|
|
59
|
+
|
|
60
|
+
### Is it free?
|
|
61
|
+
|
|
62
|
+
Yes. Links, readers, doors, reports and data rooms are free and unlimited, with no card. Sending and updating through MCP or the CLI is free. Reports and lists through MCP are free for the first 20 actions, then $0.005 each. AI answers to readers are $0.05 each. Sign-in with email or Google is needed once.
|
|
63
|
+
|
|
64
|
+
### Can it make expiring or password-protected links?
|
|
65
|
+
|
|
66
|
+
Yes. `--expires 14` (or `expires_in_days`) closes a link after 14 days. `--access verified` makes readers prove their email with Google or a 6-digit code. `--allow @acme.com` limits it to one domain. A password can be added in the app, under More settings on the link.
|
|
67
|
+
|
|
68
|
+
### How do I set it up in ChatGPT?
|
|
69
|
+
|
|
70
|
+
Settings, Apps, Developer mode on, Create app. Use the URL `https://artifactsend.com/mcp` with OAuth, then sign in.
|
|
71
|
+
|
|
72
|
+
## MCP tools
|
|
73
|
+
|
|
74
|
+
**Share:** `send_artifact` (HTML, React, Markdown, PDF, Word, PowerPoint, Excel, an image or a URL), `update_artifact`, `link_for_person`, `make_data_room`, `upload_file`, `get_artifact`, `update_link`, `set_brand`.
|
|
75
|
+
|
|
76
|
+
**See who read it:** `list_links`, `link_report`, `reader_activity`, `recent_activity`, `room_report`, `list_questions`, `list_comments`, `website_visits`, `schedule_digest`, `list_schedules`, `delete_schedule`.
|
|
77
|
+
|
|
78
|
+
**Read what others share with you:** `open_link`, `read_shared`, `ask_shared`, `message_shared_sender`, `shared_with_me`.
|
|
79
|
+
|
|
80
|
+
Reading tools are marked read-only. Tools that change things are marked so the app asks first.
|
|
81
|
+
|
|
82
|
+
## CLI
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npx artifactsend setup # add ArtifactSend to your agents
|
|
86
|
+
export ARTIFACTSEND_TOKEN=as_... # from https://artifactsend.com/app/settings?utm_source=npm&utm_medium=readme&utm_campaign=setup
|
|
87
|
+
npx artifactsend send deck.pdf --title "Seed deck" --access email
|
|
88
|
+
npx artifactsend send page.html --allow @acme.com --expires 14
|
|
89
|
+
npx artifactsend links
|
|
90
|
+
npx artifactsend report https://artifactsend.com/d/ab12cd34
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Readers and their AI
|
|
94
|
+
|
|
95
|
+
Readers open a link in the browser, or through their own AI. Every link also has its own MCP address (the link plus `/mcp`) that needs no key. By default a reader's AI gets the outline and only the parts that answer each question, so the sender sees every question and no full copy leaves. Readers are told what the sender sees, and never their chat or their AI's answers. Rules: https://artifactsend.com/ai-rules?utm_source=npm&utm_medium=readme&utm_campaign=setup
|
|
96
|
+
|
|
97
|
+
## Price
|
|
98
|
+
|
|
99
|
+
Free and unlimited for links, readers, doors, reports and data rooms. Sending and updating through MCP is free. AI answers to readers are paid per answer. https://artifactsend.com/pricing?utm_source=npm&utm_medium=readme&utm_campaign=setup
|
|
100
|
+
|
|
101
|
+
Made by [Vela Partners](https://vela.partners). MIT licensed.
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// ArtifactSend from the command line: add the MCP server to your agents, send a file as a tracked link,
|
|
3
|
+
// read who opened it, or bridge stdio-only MCP clients to https://artifactsend.com/mcp. No dependencies.
|
|
4
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from 'node:fs';
|
|
5
|
+
import { homedir, platform } from 'node:os';
|
|
6
|
+
import { join, dirname, basename, extname } from 'node:path';
|
|
7
|
+
import { spawnSync } from 'node:child_process';
|
|
8
|
+
import { createInterface } from 'node:readline';
|
|
9
|
+
|
|
10
|
+
const ORIGIN = (process.env.ARTIFACTSEND_URL || 'https://artifactsend.com').replace(/\/$/, '');
|
|
11
|
+
const MCP = ORIGIN + '/mcp';
|
|
12
|
+
// Pages people open from the CLI's own output carry a source tag. Config the CLI writes keeps the bare MCP URL.
|
|
13
|
+
const TOKENS = ORIGIN + '/app/settings?utm_source=npm&utm_medium=cli&utm_campaign=setup';
|
|
14
|
+
const SKILLS = 'LLM-preneur/skills';
|
|
15
|
+
const VERSION = '1.0.1';
|
|
16
|
+
const [cmd, ...rest] = process.argv.slice(2);
|
|
17
|
+
|
|
18
|
+
const HELP = `ArtifactSend: the link that tells you who read it.
|
|
19
|
+
|
|
20
|
+
npx artifactsend setup Add ArtifactSend to Claude Code, Cursor, VS Code, Windsurf, Gemini CLI and Codex
|
|
21
|
+
npx artifactsend send <file> Share a file as a tracked link (HTML, Markdown, PDF, Word, PowerPoint, Excel, JSX)
|
|
22
|
+
--title "Seed deck" --access public|email|verified --allow @acme.com,dana@x.com
|
|
23
|
+
--expires 14 --folder Investors --ai questions|full|off --link <existing link to update>
|
|
24
|
+
npx artifactsend links Your links with views and last open
|
|
25
|
+
npx artifactsend report <link> Who read it, how far, time per section, what they asked
|
|
26
|
+
npx artifactsend mcp Run as a stdio MCP server (bridges to ${MCP})
|
|
27
|
+
|
|
28
|
+
send, links, report and mcp need ARTIFACTSEND_TOKEN (make one at ${TOKENS}).
|
|
29
|
+
In Claude Code you can skip the token: claude mcp add --transport http artifactsend ${MCP}, then /mcp to sign in.
|
|
30
|
+
Claude.ai and ChatGPT: add a custom connector with the URL ${MCP}.`;
|
|
31
|
+
|
|
32
|
+
const flags = (args) => {
|
|
33
|
+
const o = { _: [] };
|
|
34
|
+
for (let i = 0; i < args.length; i++) {
|
|
35
|
+
const a = args[i];
|
|
36
|
+
if (a.startsWith('--')) { const k = a.slice(2); const n = args[i + 1]; if (n === undefined || n.startsWith('--')) o[k] = true; else { o[k] = n; i++; } } else o._.push(a);
|
|
37
|
+
}
|
|
38
|
+
return o;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// ---------- setup ----------
|
|
42
|
+
const readJson = (f) => { if (!existsSync(f)) return {}; const t = readFileSync(f, 'utf8').trim(); return t ? JSON.parse(t) : {}; };
|
|
43
|
+
const writeJson = (f, o) => { mkdirSync(dirname(f), { recursive: true }); if (existsSync(f)) copyFileSync(f, f + '.bak'); writeFileSync(f, JSON.stringify(o, null, 2) + '\n'); };
|
|
44
|
+
const has = (bin) => spawnSync(platform() === 'win32' ? 'where' : 'which', [bin], { stdio: 'ignore' }).status === 0;
|
|
45
|
+
|
|
46
|
+
function addJson(label, file, key, entry, dirMustExist) {
|
|
47
|
+
if (!existsSync(dirMustExist)) return null;
|
|
48
|
+
let o;
|
|
49
|
+
try { o = readJson(file); } catch { return `${label}: skipped, ${file} is not plain JSON. Add ${JSON.stringify({ artifactsend: entry })} under "${key}" yourself.`; }
|
|
50
|
+
o[key] = o[key] || {};
|
|
51
|
+
if (o[key].artifactsend) return `${label}: already added`;
|
|
52
|
+
o[key].artifactsend = entry;
|
|
53
|
+
writeJson(file, o);
|
|
54
|
+
return `${label}: added to ${file}`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function setup(opts) {
|
|
58
|
+
const h = homedir();
|
|
59
|
+
const out = [];
|
|
60
|
+
if (has('claude')) {
|
|
61
|
+
const r = spawnSync('claude', ['mcp', 'add', '--transport', 'http', '--scope', 'user', 'artifactsend', MCP], { encoding: 'utf8' });
|
|
62
|
+
const said = (r.stdout + r.stderr).toLowerCase();
|
|
63
|
+
out.push(r.status === 0 ? 'Claude Code: added. Run /mcp in Claude Code and choose artifactsend to sign in.' : said.includes('already exists') ? 'Claude Code: already added' : 'Claude Code: could not add (' + said.trim().split('\n')[0] + ')');
|
|
64
|
+
}
|
|
65
|
+
out.push(addJson('Cursor', join(h, '.cursor', 'mcp.json'), 'mcpServers', { url: MCP }, join(h, '.cursor')));
|
|
66
|
+
out.push(addJson('Windsurf', join(h, '.codeium', 'windsurf', 'mcp_config.json'), 'mcpServers', { serverUrl: MCP }, join(h, '.codeium', 'windsurf')));
|
|
67
|
+
out.push(addJson('Gemini CLI', join(h, '.gemini', 'settings.json'), 'mcpServers', { httpUrl: MCP }, join(h, '.gemini')));
|
|
68
|
+
const code = platform() === 'darwin' ? join(h, 'Library', 'Application Support', 'Code', 'User') : platform() === 'win32' ? join(process.env.APPDATA || '', 'Code', 'User') : join(h, '.config', 'Code', 'User');
|
|
69
|
+
out.push(addJson('VS Code', join(code, 'mcp.json'), 'servers', { type: 'http', url: MCP }, code));
|
|
70
|
+
const codex = join(h, '.codex');
|
|
71
|
+
if (existsSync(codex)) {
|
|
72
|
+
const f = join(codex, 'config.toml');
|
|
73
|
+
const t = existsSync(f) ? readFileSync(f, 'utf8') : '';
|
|
74
|
+
if (/^\[mcp_servers\.artifactsend\]/m.test(t)) out.push('Codex: already added');
|
|
75
|
+
else { if (t) copyFileSync(f, f + '.bak'); writeFileSync(f, t + (t && !t.endsWith('\n') ? '\n' : '') + `\n[mcp_servers.artifactsend]\nurl = "${MCP}"\n`); out.push(`Codex: added to ${f}`); }
|
|
76
|
+
}
|
|
77
|
+
const done = out.filter(Boolean);
|
|
78
|
+
if (!opts['no-skills']) {
|
|
79
|
+
const r = spawnSync('npx', ['-y', 'skills', 'add', SKILLS, '-g', '-y'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], shell: platform() === 'win32' });
|
|
80
|
+
done.push(r.status === 0 ? `Skills: installed ${SKILLS} (share-with-tracking, data-room, read-shared-link)` : `Skills: run npx skills add ${SKILLS} to install them`);
|
|
81
|
+
}
|
|
82
|
+
console.log(done.length ? done.join('\n') : 'No agents found on this computer.');
|
|
83
|
+
console.log(`\nClaude.ai and ChatGPT: add a custom connector with the URL ${MCP}\nThen ask your agent: "Share this as a tracked link and tell me who reads it."`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ---------- MCP over HTTP ----------
|
|
87
|
+
const token = () => {
|
|
88
|
+
const t = process.env.ARTIFACTSEND_TOKEN;
|
|
89
|
+
if (!t) { console.error(`Set ARTIFACTSEND_TOKEN first. Make one at ${TOKENS}`); process.exit(2); }
|
|
90
|
+
return t;
|
|
91
|
+
};
|
|
92
|
+
let rpcId = 0;
|
|
93
|
+
async function rpc(method, params, tk = token()) {
|
|
94
|
+
const r = await fetch(MCP, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json, text/event-stream', Authorization: 'Bearer ' + tk, 'User-Agent': 'artifactsend-cli/' + VERSION }, body: JSON.stringify({ jsonrpc: '2.0', id: ++rpcId, method, params }) });
|
|
95
|
+
const text = await r.text();
|
|
96
|
+
let body;
|
|
97
|
+
try { body = JSON.parse(text.startsWith('event:') || text.startsWith('data:') ? text.split('\n').filter((l) => l.startsWith('data:')).pop().slice(5) : text); } catch { throw new Error(`HTTP ${r.status}: ${text.slice(0, 200)}`); }
|
|
98
|
+
if (body.error) throw new Error(body.error.message);
|
|
99
|
+
return body.result;
|
|
100
|
+
}
|
|
101
|
+
async function call(name, args) {
|
|
102
|
+
const res = await rpc('tools/call', { name, arguments: args });
|
|
103
|
+
const text = (res.content || []).map((c) => c.text || '').join('\n');
|
|
104
|
+
if (res.isError) throw new Error(text);
|
|
105
|
+
try { return JSON.parse(text); } catch { return text; }
|
|
106
|
+
}
|
|
107
|
+
const print = (v) => console.log(typeof v === 'string' ? v : JSON.stringify(v, null, 2));
|
|
108
|
+
|
|
109
|
+
const DOCS = new Set(['.pdf', '.doc', '.docx', '.ppt', '.pptx', '.xls', '.xlsx', '.key', '.odt', '.odp', '.ods']);
|
|
110
|
+
async function send(o) {
|
|
111
|
+
const file = o._[0];
|
|
112
|
+
if (!file) { console.error('Usage: npx artifactsend send <file> [--title ...]'); process.exit(2); }
|
|
113
|
+
const ext = extname(file).toLowerCase();
|
|
114
|
+
const a = {};
|
|
115
|
+
if (/^https?:\/\//.test(file)) a.url = file;
|
|
116
|
+
else if (DOCS.has(ext)) a.document = { name: basename(file), base64: readFileSync(file).toString('base64') };
|
|
117
|
+
else if (ext === '.md' || ext === '.markdown') a.markdown = readFileSync(file, 'utf8');
|
|
118
|
+
else if (ext === '.jsx' || ext === '.tsx') a.react = readFileSync(file, 'utf8');
|
|
119
|
+
else a.html = readFileSync(file, 'utf8');
|
|
120
|
+
if (o.title) a.title = o.title;
|
|
121
|
+
if (o.access) a.access = o.access;
|
|
122
|
+
if (o.allow) a.allow = String(o.allow).split(',').map((s) => s.trim()).filter(Boolean);
|
|
123
|
+
if (o.expires) a.expires_in_days = Number(o.expires);
|
|
124
|
+
if (o.folder) a.folder = o.folder;
|
|
125
|
+
if (o.ai) a.ai_reading = o.ai;
|
|
126
|
+
if (o.link) a.link = o.link;
|
|
127
|
+
if (o['no-notify']) a.notify = false;
|
|
128
|
+
const r = await call('send_artifact', a);
|
|
129
|
+
if (r && r.url) { console.log(r.url); if (r.settings) for (const [k, v] of Object.entries(r.settings)) if (v !== null && typeof v !== 'object') console.log(` ${k.replace(/_/g, ' ')}: ${v}`); }
|
|
130
|
+
else print(r);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// stdio <-> HTTP bridge, one JSON-RPC message per line.
|
|
134
|
+
async function bridge() {
|
|
135
|
+
const tk = token();
|
|
136
|
+
const rl = createInterface({ input: process.stdin });
|
|
137
|
+
let sid = null;
|
|
138
|
+
for await (const line of rl) {
|
|
139
|
+
if (!line.trim()) continue;
|
|
140
|
+
let msg;
|
|
141
|
+
try { msg = JSON.parse(line); } catch { continue; }
|
|
142
|
+
try {
|
|
143
|
+
const r = await fetch(MCP, { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json, text/event-stream', Authorization: 'Bearer ' + tk, 'User-Agent': 'artifactsend-cli/' + VERSION, ...(sid ? { 'Mcp-Session-Id': sid } : {}) }, body: line });
|
|
144
|
+
sid = r.headers.get('mcp-session-id') || sid;
|
|
145
|
+
const text = await r.text();
|
|
146
|
+
if (!text.trim()) continue;
|
|
147
|
+
const parts = text.startsWith('event:') || text.startsWith('data:') ? text.split('\n').filter((l) => l.startsWith('data:')).map((l) => l.slice(5).trim()) : [text];
|
|
148
|
+
for (const p of parts) process.stdout.write(JSON.stringify(JSON.parse(p)) + '\n');
|
|
149
|
+
} catch (e) {
|
|
150
|
+
if (msg.id !== undefined) process.stdout.write(JSON.stringify({ jsonrpc: '2.0', id: msg.id, error: { code: -32603, message: String(e.message || e) } }) + '\n');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const o = flags(rest);
|
|
156
|
+
try {
|
|
157
|
+
if (cmd === 'setup' || cmd === 'init' || cmd === 'install') setup(o);
|
|
158
|
+
else if (cmd === 'send') await send(o);
|
|
159
|
+
else if (cmd === 'links') print(await call('list_links', o._[0] ? { query: o._.join(' ') } : {}));
|
|
160
|
+
else if (cmd === 'report') { if (!o._[0]) { console.error('Usage: npx artifactsend report <link>'); process.exit(2); } print(await call('link_report', { link: o._[0] })); }
|
|
161
|
+
else if (cmd === 'mcp') await bridge();
|
|
162
|
+
else if (cmd === '--version' || cmd === '-v') console.log(VERSION);
|
|
163
|
+
else console.log(HELP);
|
|
164
|
+
} catch (e) {
|
|
165
|
+
console.error(String(e.message || e));
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "artifactsend",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Share documents, decks, HTML pages and Claude artifacts as tracked links and data rooms. See who read them and what they asked. MCP server, agent skills and CLI.",
|
|
5
|
+
"mcpName": "com.artifactsend/mcp",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"artifactsend": "bin/artifactsend.mjs"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"mcp",
|
|
20
|
+
"mcp-server",
|
|
21
|
+
"model-context-protocol",
|
|
22
|
+
"agent-skills",
|
|
23
|
+
"claude",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"chatgpt",
|
|
26
|
+
"cursor",
|
|
27
|
+
"docsend",
|
|
28
|
+
"docsend-alternative",
|
|
29
|
+
"document-tracking",
|
|
30
|
+
"data-room",
|
|
31
|
+
"share-html",
|
|
32
|
+
"publish-html",
|
|
33
|
+
"artifacts",
|
|
34
|
+
"pitch-deck",
|
|
35
|
+
"analytics"
|
|
36
|
+
],
|
|
37
|
+
"homepage": "https://artifactsend.com",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/LLM-preneur/skills.git",
|
|
41
|
+
"directory": "artifactsend"
|
|
42
|
+
},
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/LLM-preneur/skills/issues"
|
|
45
|
+
},
|
|
46
|
+
"author": "Vela Partners (https://vela.partners)",
|
|
47
|
+
"license": "MIT"
|
|
48
|
+
}
|