@blockrun/mcp 0.9.0 → 0.11.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 +37 -9
- package/dist/index.js +95 -45
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
**Real-time data for Claude — markets, research, X/Twitter, crypto. No API keys. Pay per call.**
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
claude mcp add blockrun npx -y @blockrun/mcp@latest
|
|
10
|
+
claude mcp add blockrun -s user -- npx -y @blockrun/mcp@latest
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
Wallet auto-created. Fund with $5 USDC. Ask Claude anything.
|
|
@@ -45,13 +45,37 @@ After BlockRun, it can. Each query costs fractions of a cent, billed from a loca
|
|
|
45
45
|
|
|
46
46
|
---
|
|
47
47
|
|
|
48
|
+
## Showcase
|
|
49
|
+
|
|
50
|
+
Posters generated through `blockrun_image` with `openai/gpt-image-2`. Each is a single API call routed through BlockRun, paid in USDC on Base.
|
|
51
|
+
|
|
52
|
+
### Latest — GPT-5.5 now live on BlockRun
|
|
53
|
+
|
|
54
|
+
<p align="center">
|
|
55
|
+
<img src="assets/posters/gpt-5-5-launch.png" width="640" alt="gpt-5.5 — now live on BlockRun. Pay per call. No subscription. No keys.">
|
|
56
|
+
</p>
|
|
57
|
+
|
|
58
|
+
### Gallery
|
|
59
|
+
|
|
60
|
+
| | | |
|
|
61
|
+
|:---:|:---:|:---:|
|
|
62
|
+
| <img src="assets/posters/cornell-2026-popular-booth.png" width="280" alt="Thank you, Cornell — BlockRun at the Cornell Blockchain Conference 2026, packed booth"> | <img src="assets/posters/cornell-2026.png" width="280" alt="Thank you, Cornell — BlockRun at the Cornell Blockchain Conference 2026"> | <img src="skills/image-prompting/example-100t-poster.jpg" width="280" alt="100 Trillion Tokens served — synthwave milestone poster"> |
|
|
63
|
+
| **Cornell Blockchain Conference 2026** — packed booth recap | **Cornell Blockchain Conference 2026** — quiet variant | **100 Trillion Tokens** — milestone synthwave poster |
|
|
64
|
+
|
|
65
|
+
Prompts and a worked example for these are in [`skills/image-prompting/SKILL.md`](skills/image-prompting/SKILL.md).
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
48
69
|
## Install
|
|
49
70
|
|
|
50
71
|
**Claude Code (recommended)**
|
|
51
72
|
```bash
|
|
52
|
-
claude mcp add blockrun npx -y @blockrun/mcp@latest
|
|
73
|
+
claude mcp add blockrun -s user -- npx -y @blockrun/mcp@latest
|
|
53
74
|
```
|
|
54
75
|
|
|
76
|
+
The `-s user` flag installs globally (available in every project). The `--` separator
|
|
77
|
+
ensures `-y` is passed to `npx`, not parsed by `claude mcp add`.
|
|
78
|
+
|
|
55
79
|
**Claude Desktop** — add to `claude_desktop_config.json`:
|
|
56
80
|
```json
|
|
57
81
|
{
|
|
@@ -66,7 +90,7 @@ claude mcp add blockrun npx -y @blockrun/mcp@latest
|
|
|
66
90
|
|
|
67
91
|
**Hosted (no install, always latest)**
|
|
68
92
|
```bash
|
|
69
|
-
claude mcp add --transport http
|
|
93
|
+
claude mcp add blockrun -s user --transport http https://mcp.blockrun.ai/mcp
|
|
70
94
|
```
|
|
71
95
|
|
|
72
96
|
---
|
|
@@ -80,7 +104,7 @@ Run `blockrun_wallet` to see your address. Send USDC on Base.
|
|
|
80
104
|
| Coinbase | Send → USDC → Base network → paste address |
|
|
81
105
|
| Bridge from Ethereum | [bridge.base.org](https://bridge.base.org) |
|
|
82
106
|
|
|
83
|
-
$5 covers ~5,000 market queries, ~500 Exa searches,
|
|
107
|
+
$5 covers ~5,000 market queries, ~500 Exa searches, ~250 image generations, or ~30 Seedance 1.5-pro clips (5s).
|
|
84
108
|
|
|
85
109
|
---
|
|
86
110
|
|
|
@@ -88,14 +112,18 @@ $5 covers ~5,000 market queries, ~500 Exa searches, or ~250 image generations.
|
|
|
88
112
|
|
|
89
113
|
| Tool | Data source | Cost |
|
|
90
114
|
|------|-------------|------|
|
|
115
|
+
| `blockrun_chat` | 55+ LLMs (GPT, Claude, Gemini, DeepSeek, Kimi K2.6, GLM, NVIDIA free tier, ...) with `mode` tier routing | per token |
|
|
116
|
+
| `blockrun_image` | DALL-E 3, GPT Image 1/2, Grok Imagine, Flux, CogView-4, Nano Banana — generation + editing | $0.015–0.12 |
|
|
117
|
+
| `blockrun_video` | xAI Grok Imagine Video + ByteDance Seedance 1.5/2.0/2.0-fast | $0.03–0.30/sec |
|
|
118
|
+
| `blockrun_music` | MiniMax music generation | per track |
|
|
119
|
+
| `blockrun_price` | Pyth-backed realtime + OHLC — crypto / FX / commodity (free), 12 stock markets (paid) | free or $0.001/call |
|
|
91
120
|
| `blockrun_markets` | Polymarket, Kalshi, dFlow, Binance Futures | $0.001/query |
|
|
121
|
+
| `blockrun_x` | X/Twitter — profiles, tweets, followers, mentions, search (AttentionVC) | per call |
|
|
92
122
|
| `blockrun_exa` | Neural web search (Exa) — research, competitors, papers, URL content | $0.01/query |
|
|
93
|
-
| `blockrun_search` |
|
|
94
|
-
| `blockrun_twitter` | X/Twitter — profiles, tweets, trends, Grok sentiment | per token |
|
|
123
|
+
| `blockrun_search` | Grok Live Search — web + news with citations | ~$0.025 per source |
|
|
95
124
|
| `blockrun_dex` | Live DEX prices via DexScreener | free |
|
|
96
|
-
| `
|
|
97
|
-
| `
|
|
98
|
-
| `blockrun_wallet` | Balance, spending, agent budgets | free |
|
|
125
|
+
| `blockrun_models` | Live catalogue of every LLM/image/video/music model + pricing | free |
|
|
126
|
+
| `blockrun_wallet` | Balance, spending, agent budgets, setup QR | free |
|
|
99
127
|
|
|
100
128
|
---
|
|
101
129
|
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
+
import { readFileSync } from "fs";
|
|
4
5
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
6
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
7
|
|
|
@@ -116,8 +117,8 @@ var MODEL_TIERS = {
|
|
|
116
117
|
powerful: ["openai/gpt-5.4-pro", "anthropic/claude-opus-4.7", "anthropic/claude-opus-4.6", "openai/o3", "openai/gpt-5.4"],
|
|
117
118
|
cheap: ["zai/glm-5", "zai/glm-5-turbo", "nvidia/gpt-oss-120b", "nvidia/deepseek-v3.2", "google/gemini-2.5-flash", "deepseek/deepseek-chat", "openai/gpt-5.4-nano"],
|
|
118
119
|
reasoning: ["openai/o3", "openai/o1", "openai/o3-mini", "deepseek/deepseek-reasoner", "moonshot/kimi-k2.6", "openai/gpt-5.3-codex"],
|
|
119
|
-
free: ["nvidia/
|
|
120
|
-
coding: ["zai/glm-5", "openai/gpt-5.3-codex", "moonshot/kimi-k2.6", "nvidia/qwen3-coder-480b", "
|
|
120
|
+
free: ["nvidia/qwen3-next-80b-a3b-thinking", "nvidia/mistral-small-4-119b", "nvidia/gpt-oss-120b", "nvidia/deepseek-v3.2", "nvidia/qwen3-coder-480b", "nvidia/llama-4-maverick", "nvidia/gpt-oss-20b", "nvidia/glm-4.7"],
|
|
121
|
+
coding: ["zai/glm-5", "openai/gpt-5.3-codex", "moonshot/kimi-k2.6", "nvidia/qwen3-coder-480b", "anthropic/claude-sonnet-4.6", "openai/gpt-5.4"],
|
|
121
122
|
glm: ["zai/glm-5", "zai/glm-5-turbo", "nvidia/glm-4.7"]
|
|
122
123
|
};
|
|
123
124
|
|
|
@@ -610,13 +611,14 @@ Generation models:
|
|
|
610
611
|
- xai/grok-imagine-image ($0.02) \u2014 xAI Grok Imagine, stylized, fast
|
|
611
612
|
- xai/grok-imagine-image-pro ($0.07) \u2014 xAI Grok Imagine Pro, higher quality
|
|
612
613
|
- openai/gpt-image-1 ($0.02-0.04) \u2014 GPT native image generation
|
|
614
|
+
- openai/gpt-image-2 ($0.06-0.12) \u2014 ChatGPT Images 2.0, reasoning-driven, multilingual text rendering + character consistency
|
|
613
615
|
- openai/dall-e-3 ($0.04-0.08) \u2014 High quality, prompt adherence
|
|
614
616
|
- google/nano-banana ($0.05) \u2014 Google image model
|
|
615
|
-
Edit models: openai/gpt-image-1 (default for edits)`,
|
|
617
|
+
Edit models: openai/gpt-image-1, openai/gpt-image-2 (default for edits)`,
|
|
616
618
|
inputSchema: {
|
|
617
619
|
prompt: z4.string().describe("Image description or edit instructions"),
|
|
618
620
|
action: z4.enum(["generate", "edit"]).optional().default("generate").describe("generate: create from text; edit: transform existing image"),
|
|
619
|
-
model: z4.enum(["zai/cogview-4", "openai/dall-e-3", "together/flux-schnell", "google/nano-banana", "openai/gpt-image-1", "xai/grok-imagine-image", "xai/grok-imagine-image-pro"]).optional().describe("Model to use (default: dall-e-3 for generate, gpt-image-
|
|
621
|
+
model: z4.enum(["zai/cogview-4", "openai/dall-e-3", "together/flux-schnell", "google/nano-banana", "openai/gpt-image-1", "openai/gpt-image-2", "xai/grok-imagine-image", "xai/grok-imagine-image-pro"]).optional().describe("Model to use (default: dall-e-3 for generate, gpt-image-2 for edit). xai/grok-imagine-image is stylized and fast; xai/grok-imagine-image-pro is higher quality; gpt-image-2 is the newest edit-capable model with stronger instruction following."),
|
|
620
622
|
image: z4.string().optional().describe("Source image for edit action: base64-encoded image or URL"),
|
|
621
623
|
size: z4.enum(["1024x1024", "1792x1024", "1024x1792"]).optional().default("1024x1024"),
|
|
622
624
|
quality: z4.enum(["standard", "hd"]).optional().default("standard")
|
|
@@ -634,7 +636,7 @@ Edit models: openai/gpt-image-1 (default for edits)`,
|
|
|
634
636
|
};
|
|
635
637
|
}
|
|
636
638
|
response = await imgClient.edit(prompt, image, {
|
|
637
|
-
model: model || "openai/gpt-image-
|
|
639
|
+
model: model || "openai/gpt-image-2",
|
|
638
640
|
size
|
|
639
641
|
});
|
|
640
642
|
} else {
|
|
@@ -824,41 +826,46 @@ import {
|
|
|
824
826
|
extractPaymentDetails as extractPaymentDetails2
|
|
825
827
|
} from "@blockrun/llm";
|
|
826
828
|
var BLOCKRUN_API2 = "https://blockrun.ai/api";
|
|
827
|
-
var
|
|
829
|
+
var TOTAL_BUDGET_MS = 3e5;
|
|
830
|
+
var POLL_INTERVAL_MS = 5e3;
|
|
828
831
|
function registerVideoTool(server) {
|
|
829
832
|
server.registerTool(
|
|
830
833
|
"blockrun_video",
|
|
831
834
|
{
|
|
832
|
-
description: `Generate short AI videos via BlockRun x402.
|
|
835
|
+
description: `Generate short AI videos via BlockRun x402 (async, client-polled).
|
|
833
836
|
|
|
834
|
-
|
|
837
|
+
Turns a text prompt (and optional seed image) into a short MP4 clip. The tool submits the job, then polls until the video is ready (typical total wall-time 60-180s; 5 min hard cap). Payment is settled only when upstream returns a finished video \u2014 if the job fails or we give up, you are not charged.
|
|
835
838
|
|
|
836
|
-
|
|
839
|
+
Models:
|
|
840
|
+
- xai/grok-imagine-video ($0.05/sec, 8s default -> $0.42/clip) \u2014 stylized, fast
|
|
841
|
+
- bytedance/seedance-1.5-pro ($0.03/sec, 720p, 5s default up to 10s) \u2014 cheapest
|
|
842
|
+
- bytedance/seedance-2.0-fast ($0.15/sec, ~60-80s gen) \u2014 sweet-spot price/quality
|
|
843
|
+
- bytedance/seedance-2.0 ($0.30/sec, 720p Pro) \u2014 highest quality
|
|
837
844
|
|
|
838
845
|
Returns a permanent blockrun-hosted MP4 URL (the gateway mirrors the asset to GCS so URLs don't expire).`,
|
|
839
846
|
inputSchema: {
|
|
840
847
|
prompt: z6.string().describe("Text description of the video to generate. E.g. 'a red apple slowly spinning on a wooden table', 'a hummingbird hovering near a red flower, ultra slow motion'"),
|
|
841
848
|
image_url: z6.string().url().optional().describe("Optional seed image URL for image-to-video generation"),
|
|
842
|
-
duration_seconds: z6.number().int().min(1).max(60).optional().describe("Duration to bill for (defaults to the model's 8s
|
|
843
|
-
model: z6.enum(["xai/grok-imagine-video"]).optional().default("xai/grok-imagine-video").describe("Video model to use")
|
|
849
|
+
duration_seconds: z6.number().int().min(1).max(60).optional().describe("Duration to bill for (defaults to the model's default \u2014 8s for xAI, 5s for Seedance; Seedance supports up to 10s)."),
|
|
850
|
+
model: z6.enum(["xai/grok-imagine-video", "bytedance/seedance-1.5-pro", "bytedance/seedance-2.0-fast", "bytedance/seedance-2.0"]).optional().default("xai/grok-imagine-video").describe("Video model to use")
|
|
844
851
|
}
|
|
845
852
|
},
|
|
846
853
|
async ({ prompt, image_url, duration_seconds, model }) => {
|
|
847
854
|
try {
|
|
848
855
|
const privateKey = getOrCreateWalletKey();
|
|
849
856
|
const account = privateKeyToAccount2(privateKey);
|
|
850
|
-
const
|
|
857
|
+
const submitUrl = `${BLOCKRUN_API2}/v1/videos/generations`;
|
|
851
858
|
const body = { model, prompt };
|
|
852
859
|
if (image_url) body.image_url = image_url;
|
|
853
860
|
if (duration_seconds !== void 0) body.duration_seconds = duration_seconds;
|
|
854
|
-
const resp402 = await fetchWithTimeout2(
|
|
861
|
+
const resp402 = await fetchWithTimeout2(submitUrl, {
|
|
855
862
|
method: "POST",
|
|
856
863
|
headers: { "Content-Type": "application/json" },
|
|
857
864
|
body: JSON.stringify(body)
|
|
858
865
|
}, 15e3);
|
|
859
866
|
if (resp402.status !== 402) {
|
|
860
|
-
const
|
|
861
|
-
throw new Error(`Expected 402, got ${resp402.status}: ${JSON.stringify(
|
|
867
|
+
const data = await resp402.json();
|
|
868
|
+
throw new Error(`Expected 402, got ${resp402.status}: ${JSON.stringify(data)}`);
|
|
862
869
|
}
|
|
863
870
|
const prHeader = resp402.headers.get("payment-required") || resp402.headers.get("PAYMENT-REQUIRED");
|
|
864
871
|
if (!prHeader) throw new Error("No PAYMENT-REQUIRED header in 402 response");
|
|
@@ -871,50 +878,91 @@ Returns a permanent blockrun-hosted MP4 URL (the gateway mirrors the asset to GC
|
|
|
871
878
|
details.amount,
|
|
872
879
|
details.network || "eip155:8453",
|
|
873
880
|
{
|
|
874
|
-
resourceUrl: details.resource?.url ||
|
|
881
|
+
resourceUrl: details.resource?.url || submitUrl,
|
|
875
882
|
resourceDescription: details.resource?.description || "BlockRun Video Generation",
|
|
876
|
-
|
|
883
|
+
// Bump to 10 min so the signed authorization stays valid through the
|
|
884
|
+
// async polling window. Default (~5 min) is tight when upstream is slow.
|
|
885
|
+
maxTimeoutSeconds: Math.max(details.maxTimeoutSeconds || 0, 600),
|
|
877
886
|
extra: details.extra
|
|
878
887
|
}
|
|
879
888
|
);
|
|
880
|
-
const
|
|
889
|
+
const submitResp = await fetchWithTimeout2(submitUrl, {
|
|
881
890
|
method: "POST",
|
|
882
891
|
headers: {
|
|
883
892
|
"Content-Type": "application/json",
|
|
884
893
|
"PAYMENT-SIGNATURE": paymentPayload
|
|
885
894
|
},
|
|
886
895
|
body: JSON.stringify(body)
|
|
887
|
-
},
|
|
888
|
-
if (
|
|
896
|
+
}, 3e4);
|
|
897
|
+
if (submitResp.status === 402) {
|
|
889
898
|
throw new Error("Payment rejected. Check your wallet balance.");
|
|
890
899
|
}
|
|
891
|
-
if (!
|
|
892
|
-
const errBody = await
|
|
893
|
-
throw new Error(`API error ${
|
|
900
|
+
if (!submitResp.ok && submitResp.status !== 202) {
|
|
901
|
+
const errBody = await submitResp.json().catch(() => ({ error: "Submit failed" }));
|
|
902
|
+
throw new Error(`API error ${submitResp.status}: ${JSON.stringify(errBody)}`);
|
|
903
|
+
}
|
|
904
|
+
const submitData = await submitResp.json();
|
|
905
|
+
if (!submitData.id || !submitData.poll_url) {
|
|
906
|
+
throw new Error(`Submit response missing id/poll_url: ${JSON.stringify(submitData)}`);
|
|
907
|
+
}
|
|
908
|
+
const pollAbsoluteUrl = submitData.poll_url.startsWith("http") ? submitData.poll_url : `${BLOCKRUN_API2.replace(/\/api$/, "")}${submitData.poll_url}`;
|
|
909
|
+
const startedAt = Date.now();
|
|
910
|
+
let lastStatus = submitData.status || "queued";
|
|
911
|
+
let completed = null;
|
|
912
|
+
while (Date.now() - startedAt < TOTAL_BUDGET_MS) {
|
|
913
|
+
await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
914
|
+
const pollResp = await fetchWithTimeout2(pollAbsoluteUrl, {
|
|
915
|
+
method: "GET",
|
|
916
|
+
headers: { "PAYMENT-SIGNATURE": paymentPayload }
|
|
917
|
+
}, 9e4);
|
|
918
|
+
const pollData = await pollResp.json().catch(() => ({}));
|
|
919
|
+
lastStatus = pollData.status || lastStatus;
|
|
920
|
+
if (pollResp.status === 202 && (lastStatus === "queued" || lastStatus === "in_progress")) {
|
|
921
|
+
continue;
|
|
922
|
+
}
|
|
923
|
+
if (lastStatus === "failed") {
|
|
924
|
+
throw new Error(`Upstream generation failed: ${pollData.error || "unknown"}. No payment taken.`);
|
|
925
|
+
}
|
|
926
|
+
if (pollResp.ok && lastStatus === "completed") {
|
|
927
|
+
const clip = pollData.data?.[0];
|
|
928
|
+
if (!clip?.url) throw new Error("Completed poll missing video URL");
|
|
929
|
+
completed = {
|
|
930
|
+
url: clip.url,
|
|
931
|
+
source_url: clip.source_url,
|
|
932
|
+
duration_seconds: clip.duration_seconds,
|
|
933
|
+
request_id: clip.request_id,
|
|
934
|
+
backed_up: clip.backed_up,
|
|
935
|
+
modelReturned: pollData.model,
|
|
936
|
+
txHash: pollResp.headers.get("X-Payment-Receipt") || pollResp.headers.get("x-payment-receipt") || void 0
|
|
937
|
+
};
|
|
938
|
+
break;
|
|
939
|
+
}
|
|
940
|
+
if (!pollResp.ok && pollResp.status !== 202 && pollResp.status !== 504) {
|
|
941
|
+
throw new Error(`Poll error ${pollResp.status}: ${JSON.stringify(pollData)}`);
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
if (!completed) {
|
|
945
|
+
throw new Error(`Video generation did not complete within ${Math.round(TOTAL_BUDGET_MS / 1e3)}s (last status: ${lastStatus}). No payment was taken.`);
|
|
894
946
|
}
|
|
895
|
-
const data = await resp.json();
|
|
896
|
-
const clip = data.data?.[0];
|
|
897
|
-
if (!clip?.url) throw new Error("No video URL in response");
|
|
898
|
-
const txHash = resp.headers.get("X-Payment-Receipt") || resp.headers.get("x-payment-receipt");
|
|
899
947
|
const lines = [
|
|
900
948
|
`\u{1F3AC} Video ready!`,
|
|
901
|
-
`URL: ${
|
|
902
|
-
`Duration: ${
|
|
903
|
-
`Model: ${
|
|
904
|
-
...
|
|
905
|
-
...
|
|
906
|
-
...txHash ? [`Tx: ${txHash}`] : []
|
|
949
|
+
`URL: ${completed.url}`,
|
|
950
|
+
`Duration: ${completed.duration_seconds ? `${completed.duration_seconds}s` : "8s"}`,
|
|
951
|
+
`Model: ${completed.modelReturned || model}`,
|
|
952
|
+
...completed.backed_up ? [`Backed up to BlockRun storage (URL is permanent)`] : completed.source_url ? [`Source URL: ${completed.source_url}`] : [],
|
|
953
|
+
...completed.request_id ? [`Request ID: ${completed.request_id}`] : [],
|
|
954
|
+
...completed.txHash ? [`Tx: ${completed.txHash}`] : []
|
|
907
955
|
];
|
|
908
956
|
return {
|
|
909
957
|
content: [{ type: "text", text: lines.join("\n") }],
|
|
910
958
|
structuredContent: {
|
|
911
|
-
url:
|
|
912
|
-
...
|
|
913
|
-
duration_seconds:
|
|
914
|
-
model:
|
|
915
|
-
...
|
|
916
|
-
...
|
|
917
|
-
...txHash ? { txHash } : {}
|
|
959
|
+
url: completed.url,
|
|
960
|
+
...completed.source_url ? { source_url: completed.source_url } : {},
|
|
961
|
+
duration_seconds: completed.duration_seconds,
|
|
962
|
+
model: completed.modelReturned || model,
|
|
963
|
+
...completed.request_id ? { request_id: completed.request_id } : {},
|
|
964
|
+
...completed.backed_up !== void 0 ? { backed_up: completed.backed_up } : {},
|
|
965
|
+
...completed.txHash ? { txHash: completed.txHash } : {}
|
|
918
966
|
}
|
|
919
967
|
};
|
|
920
968
|
} catch (err) {
|
|
@@ -926,9 +974,9 @@ Error: ${errMsg}` }],
|
|
|
926
974
|
isError: true
|
|
927
975
|
};
|
|
928
976
|
}
|
|
929
|
-
if (errMsg.includes("abort") || errMsg.includes("timeout") || errMsg.includes("Timeout") || errMsg.includes("timed out")) {
|
|
977
|
+
if (errMsg.includes("abort") || errMsg.includes("timeout") || errMsg.includes("Timeout") || errMsg.includes("timed out") || errMsg.includes("did not complete within")) {
|
|
930
978
|
return {
|
|
931
|
-
content: [{ type: "text", text: `Video generation timed out.
|
|
979
|
+
content: [{ type: "text", text: `Video generation timed out. The upstream async job didn't complete in time \u2014 please try again.
|
|
932
980
|
Error: ${errMsg}` }],
|
|
933
981
|
isError: true
|
|
934
982
|
};
|
|
@@ -1630,7 +1678,7 @@ function warnOnLeakedKeys() {
|
|
|
1630
1678
|
console.error(" 3. Reconnect using the local package (signs locally, key");
|
|
1631
1679
|
console.error(" never leaves your machine):");
|
|
1632
1680
|
console.error(" claude mcp remove blockrun");
|
|
1633
|
-
console.error(" claude mcp add blockrun npx -y @blockrun/mcp@latest");
|
|
1681
|
+
console.error(" claude mcp add blockrun -s user -- npx -y @blockrun/mcp@latest");
|
|
1634
1682
|
console.error("");
|
|
1635
1683
|
console.error(" Details: https://github.com/BlockRunAI/blockrun-mcp-server/issues/1");
|
|
1636
1684
|
console.error("");
|
|
@@ -1638,7 +1686,9 @@ function warnOnLeakedKeys() {
|
|
|
1638
1686
|
}
|
|
1639
1687
|
|
|
1640
1688
|
// src/index.ts
|
|
1641
|
-
var VERSION =
|
|
1689
|
+
var { version: VERSION } = JSON.parse(
|
|
1690
|
+
readFileSync(new URL("../package.json", import.meta.url), "utf-8")
|
|
1691
|
+
);
|
|
1642
1692
|
async function checkForUpdate() {
|
|
1643
1693
|
try {
|
|
1644
1694
|
const resp = await fetch("https://registry.npmjs.org/@blockrun/mcp/latest", {
|
|
@@ -1647,7 +1697,7 @@ async function checkForUpdate() {
|
|
|
1647
1697
|
const data = await resp.json();
|
|
1648
1698
|
if (data.version && data.version !== VERSION) {
|
|
1649
1699
|
console.error(`[BlockRun] Update available: v${VERSION} \u2192 v${data.version}`);
|
|
1650
|
-
console.error(`[BlockRun] Run: claude mcp add blockrun npx -y @blockrun/mcp@latest`);
|
|
1700
|
+
console.error(`[BlockRun] Run: claude mcp add blockrun -s user -- npx -y @blockrun/mcp@latest`);
|
|
1651
1701
|
}
|
|
1652
1702
|
} catch {
|
|
1653
1703
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blockrun/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"mcpName": "io.github.BlockRunAI/blockrun-mcp",
|
|
5
5
|
"description": "BlockRun MCP Server - Give your AI agent web search, deep research, prediction markets, crypto data, X/Twitter intelligence. Paid via x402 micropayments.",
|
|
6
6
|
"type": "module",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"url": "https://github.com/blockrunai/blockrun-mcp/issues"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@blockrun/llm": "^1.
|
|
47
|
+
"@blockrun/llm": "^1.9.0",
|
|
48
48
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
49
49
|
"open": "^11.0.0",
|
|
50
50
|
"qrcode": "^1.5.4",
|