moltalyzer-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 jcislo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,116 @@
1
+ # moltalyzer-mcp
2
+
3
+ MCP server for [Moltalyzer](https://moltalyzer.xyz) — crypto intelligence, GitHub trends, prediction market signals, and token analysis via x402 micropayments.
4
+
5
+ Works with Claude Desktop, Claude Code, ChatGPT, Cursor, and any MCP-compatible client.
6
+
7
+ ## Setup
8
+
9
+ ### 1. Get a wallet with USDC on Base
10
+
11
+ You need an EVM wallet private key with USDC on Base Mainnet. Each tool call costs $0.005–$0.05.
12
+
13
+ ### 2. Add to your MCP client
14
+
15
+ **Claude Desktop** (`claude_desktop_config.json`):
16
+
17
+ ```json
18
+ {
19
+ "mcpServers": {
20
+ "moltalyzer": {
21
+ "command": "npx",
22
+ "args": ["-y", "moltalyzer-mcp"],
23
+ "env": {
24
+ "EVM_PRIVATE_KEY": "0xYOUR_PRIVATE_KEY_HERE"
25
+ }
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ **Claude Code** (`.claude/settings.json`):
32
+
33
+ ```json
34
+ {
35
+ "mcpServers": {
36
+ "moltalyzer": {
37
+ "command": "npx",
38
+ "args": ["-y", "moltalyzer-mcp"],
39
+ "env": {
40
+ "EVM_PRIVATE_KEY": "0xYOUR_PRIVATE_KEY_HERE"
41
+ }
42
+ }
43
+ }
44
+ }
45
+ ```
46
+
47
+ **Cursor** (`.cursor/mcp.json`):
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "moltalyzer": {
53
+ "command": "npx",
54
+ "args": ["-y", "moltalyzer-mcp"],
55
+ "env": {
56
+ "EVM_PRIVATE_KEY": "0xYOUR_PRIVATE_KEY_HERE"
57
+ }
58
+ }
59
+ }
60
+ }
61
+ ```
62
+
63
+ ## Tools
64
+
65
+ ### Moltbook (Crypto Community Intelligence)
66
+
67
+ | Tool | Description | Price |
68
+ |------|-------------|-------|
69
+ | `get_moltbook_digest` | Latest hourly community sentiment digest — topics, narratives, hot discussions | $0.005 |
70
+ | `get_moltbook_history` | Historical hourly digests (1-24h lookback) | $0.02 |
71
+
72
+ ### GitHub (Trending Repos)
73
+
74
+ | Tool | Description | Price |
75
+ |------|-------------|-------|
76
+ | `get_github_digest` | Latest daily digest of trending new repos | $0.02 |
77
+ | `get_github_history` | Historical daily digests (1-30 days) | $0.05 |
78
+ | `get_github_repos` | Top trending repos, filterable by language | $0.01 |
79
+
80
+ ### Polymarket (Predetermined Outcome Detection)
81
+
82
+ | Tool | Description | Price |
83
+ |------|-------------|-------|
84
+ | `get_polymarket_signal` | Single signal — markets where outcome is already known by insiders | $0.01 |
85
+ | `get_polymarket_signals` | Batch of up to 20 signals, with polling support | $0.03 |
86
+
87
+ ### Tokens (Real-Time Token Intelligence)
88
+
89
+ | Tool | Description | Price |
90
+ |------|-------------|-------|
91
+ | `get_token_signal` | Single token signal with hybrid AI scoring, risk flags, backtests | $0.01 |
92
+ | `get_token_signals` | Batch of up to 20 signals, filter by chain/tier/score | $0.05 |
93
+ | `get_token_history` | Historical signals by date range (max 7 days, paginated) | $0.03 |
94
+
95
+ ## Environment Variables
96
+
97
+ | Variable | Required | Description |
98
+ |----------|----------|-------------|
99
+ | `EVM_PRIVATE_KEY` | Yes | Wallet private key (0x-prefixed) with USDC on Base Mainnet |
100
+ | `MOLTALYZER_API_URL` | No | Override API base URL (default: `https://api.moltalyzer.xyz`) |
101
+
102
+ ## How it works
103
+
104
+ This MCP server wraps the [Moltalyzer x402 API](https://api.moltalyzer.xyz/api). When an AI agent calls a tool, the server:
105
+
106
+ 1. Makes an HTTP request to the API endpoint
107
+ 2. Receives a 402 Payment Required response
108
+ 3. Automatically signs a USDC payment on Base using your wallet
109
+ 4. Retries the request with the payment signature
110
+ 5. Returns the data to the agent
111
+
112
+ All payments use the [x402 protocol](https://www.x402.org/) — sub-cent micropayments with no API keys, accounts, or subscriptions.
113
+
114
+ ## License
115
+
116
+ MIT
@@ -0,0 +1,4 @@
1
+ export declare const BASE_URL: string;
2
+ export declare function fetchWithTimeout(fetchFn: typeof fetch, url: string): Promise<Response>;
3
+ export declare function createFetchWithPayment(): typeof fetch;
4
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,QAAQ,QAC2C,CAAC;AAIjE,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,KAAK,EACrB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,QAAQ,CAAC,CAMnB;AAED,wBAAgB,sBAAsB,IAAI,OAAO,KAAK,CAkCrD"}
@@ -0,0 +1,41 @@
1
+ import { wrapFetchWithPaymentFromConfig } from "@x402/fetch";
2
+ import { ExactEvmScheme, toClientEvmSigner } from "@x402/evm";
3
+ import { privateKeyToAccount } from "viem/accounts";
4
+ import { createPublicClient, http } from "viem";
5
+ import { base } from "viem/chains";
6
+ export const BASE_URL = process.env.MOLTALYZER_API_URL || "https://api.moltalyzer.xyz";
7
+ const REQUEST_TIMEOUT_MS = 30_000;
8
+ export function fetchWithTimeout(fetchFn, url) {
9
+ const controller = new AbortController();
10
+ const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
11
+ return fetchFn(url, { signal: controller.signal }).finally(() => clearTimeout(timer));
12
+ }
13
+ export function createFetchWithPayment() {
14
+ const privateKey = process.env.EVM_PRIVATE_KEY;
15
+ if (!privateKey) {
16
+ throw new Error("EVM_PRIVATE_KEY environment variable is required. " +
17
+ "Set it to your wallet private key (0x-prefixed hex string) " +
18
+ "with USDC on Base Mainnet for x402 micropayments.");
19
+ }
20
+ let account;
21
+ try {
22
+ account = privateKeyToAccount(privateKey);
23
+ }
24
+ catch {
25
+ throw new Error("EVM_PRIVATE_KEY is invalid. Expected a 0x-prefixed 64-character hex string (32 bytes).");
26
+ }
27
+ const publicClient = createPublicClient({
28
+ chain: base,
29
+ transport: http(),
30
+ });
31
+ const signer = toClientEvmSigner(account, publicClient);
32
+ return wrapFetchWithPaymentFromConfig(fetch, {
33
+ schemes: [
34
+ {
35
+ network: "eip155:8453",
36
+ client: new ExactEvmScheme(signer),
37
+ },
38
+ ],
39
+ });
40
+ }
41
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,MAAM,CAAC,MAAM,QAAQ,GACnB,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,4BAA4B,CAAC;AAEjE,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,UAAU,gBAAgB,CAC9B,OAAqB,EACrB,GAAW;IAEX,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAC9D,YAAY,CAAC,KAAK,CAAC,CACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,oDAAoD;YAClD,6DAA6D;YAC7D,mDAAmD,CACtD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,mBAAmB,CAAC,UAA2B,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC;QACtC,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI,EAAE;KAClB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAExD,OAAO,8BAA8B,CAAC,KAAK,EAAE;QAC3C,OAAO,EAAE;YACP;gBACE,OAAO,EAAE,aAAa;gBACtB,MAAM,EAAE,IAAI,cAAc,CAAC,MAAM,CAAC;aACnC;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/build/index.js ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, join } from "node:path";
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { createFetchWithPayment } from "./client.js";
8
+ import { register as registerMoltbook } from "./tools/moltbook.js";
9
+ import { register as registerGithub } from "./tools/github.js";
10
+ import { register as registerPolymarket } from "./tools/polymarket.js";
11
+ import { register as registerTokens } from "./tools/tokens.js";
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
14
+ // All logging to stderr (stdout reserved for MCP protocol)
15
+ const log = (...args) => console.error("[moltalyzer-mcp]", ...args);
16
+ // Validate env before starting
17
+ if (!process.env.EVM_PRIVATE_KEY) {
18
+ log("ERROR: EVM_PRIVATE_KEY environment variable is required.\n" +
19
+ "Set it to your wallet private key (0x-prefixed hex string) " +
20
+ "with USDC on Base Mainnet for x402 micropayments.\n\n" +
21
+ "Example MCP config:\n" +
22
+ JSON.stringify({
23
+ mcpServers: {
24
+ moltalyzer: {
25
+ command: "npx",
26
+ args: ["-y", "moltalyzer-mcp"],
27
+ env: { EVM_PRIVATE_KEY: "0x..." },
28
+ },
29
+ },
30
+ }, null, 2));
31
+ process.exit(1);
32
+ }
33
+ async function main() {
34
+ const fetchWithPayment = createFetchWithPayment();
35
+ const server = new McpServer({
36
+ name: "moltalyzer-mcp",
37
+ version: pkg.version,
38
+ });
39
+ // Register all tool modules
40
+ registerMoltbook(server, fetchWithPayment);
41
+ registerGithub(server, fetchWithPayment);
42
+ registerPolymarket(server, fetchWithPayment);
43
+ registerTokens(server, fetchWithPayment);
44
+ const transport = new StdioServerTransport();
45
+ await server.connect(transport);
46
+ log("Server started with 10 tools");
47
+ }
48
+ main().catch((err) => {
49
+ log("Fatal error:", err);
50
+ process.exit(1);
51
+ });
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE/D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAErF,2DAA2D;AAC3D,MAAM,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;AAE/E,+BAA+B;AAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;IACjC,GAAG,CACD,4DAA4D;QAC1D,6DAA6D;QAC7D,uDAAuD;QACvD,uBAAuB;QACvB,IAAI,CAAC,SAAS,CACZ;YACE,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC;oBAC9B,GAAG,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE;iBAClC;aACF;SACF,EACD,IAAI,EACJ,CAAC,CACF,CACJ,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAC;IAElD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IAEH,4BAA4B;IAC5B,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACzC,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AACtC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare function errorResult(res: Response): Promise<{
2
+ content: {
3
+ type: "text";
4
+ text: string;
5
+ }[];
6
+ isError: true;
7
+ }>;
8
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/tools/error.ts"],"names":[],"mappings":"AAAA,wBAAsB,WAAW,CAAC,GAAG,EAAE,QAAQ;;;;;;GAY9C"}
@@ -0,0 +1,14 @@
1
+ export async function errorResult(res) {
2
+ const body = await res.text().catch(() => "");
3
+ if (res.status === 402) {
4
+ return {
5
+ content: [{ type: "text", text: `Payment failed (HTTP 402). Ensure your wallet has USDC on Base Mainnet. Details: ${body}` }],
6
+ isError: true,
7
+ };
8
+ }
9
+ return {
10
+ content: [{ type: "text", text: `API error ${res.status}: ${body}` }],
11
+ isError: true,
12
+ };
13
+ }
14
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/tools/error.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAa;IAC7C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oFAAoF,IAAI,EAAE,EAAE,CAAC;YACtI,OAAO,EAAE,IAAa;SACvB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,aAAa,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,EAAE,CAAC;QAC9E,OAAO,EAAE,IAAa;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer, fetchFn: typeof fetch): void;
3
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/tools/github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,KAAK,QA8ChE"}
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import { BASE_URL, fetchWithTimeout } from "../client.js";
3
+ import { errorResult } from "./error.js";
4
+ export function register(server, fetchFn) {
5
+ server.registerTool("get_github_digest", {
6
+ description: "Get the latest daily GitHub trending repos digest — AI analysis of newly created repositories gaining traction, organized by category with emerging tools, language trends, and notable projects. Runs daily at 06:00 UTC scanning repos created in the last 24 hours. Costs $0.02 USDC via x402.",
7
+ }, async () => {
8
+ const res = await fetchWithTimeout(fetchFn, `${BASE_URL}/api/github/digests/latest`);
9
+ if (!res.ok)
10
+ return errorResult(res);
11
+ const data = await res.json();
12
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
13
+ });
14
+ server.registerTool("get_github_history", {
15
+ description: "Get historical daily GitHub digests — trending repo analysis over a configurable lookback window (1-30 days). Track how developer interest and project categories evolve over time. Returns an array of daily digest objects. Costs $0.05 USDC via x402.",
16
+ inputSchema: {
17
+ days: z.number().int().min(1).max(30).optional().describe("How many days back to look (1-30, default 7)"),
18
+ limit: z.number().int().min(1).max(30).optional().describe("Maximum number of digests to return (1-30, default 7)"),
19
+ },
20
+ }, async ({ days, limit }) => {
21
+ const params = new URLSearchParams();
22
+ if (days !== undefined)
23
+ params.set("days", String(days));
24
+ if (limit !== undefined)
25
+ params.set("limit", String(limit));
26
+ const url = `${BASE_URL}/api/github/digests${params.size ? "?" + params : ""}`;
27
+ const res = await fetchWithTimeout(fetchFn, url);
28
+ if (!res.ok)
29
+ return errorResult(res);
30
+ const data = await res.json();
31
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
32
+ });
33
+ server.registerTool("get_github_repos", {
34
+ description: "Get top trending GitHub repos from the latest daily scan, sorted by stars. Filter by programming language. Returns repo name, description, stars, forks, language, topics, license, author info, and README excerpt. Costs $0.01 USDC via x402.",
35
+ inputSchema: {
36
+ limit: z.number().int().min(1).max(100).optional().describe("Maximum repos to return (1-100, default 30)"),
37
+ language: z.string().optional().describe("Filter by programming language (e.g. 'TypeScript', 'Python', 'Rust'). Case-insensitive."),
38
+ },
39
+ }, async ({ limit, language }) => {
40
+ const params = new URLSearchParams();
41
+ if (limit !== undefined)
42
+ params.set("limit", String(limit));
43
+ if (language !== undefined)
44
+ params.set("language", language);
45
+ const url = `${BASE_URL}/api/github/repos${params.size ? "?" + params : ""}`;
46
+ const res = await fetchWithTimeout(fetchFn, url);
47
+ if (!res.ok)
48
+ return errorResult(res);
49
+ const data = await res.json();
50
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
51
+ });
52
+ }
53
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/tools/github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer, fetchFn: typeof fetch): void;
3
+ //# sourceMappingURL=moltbook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moltbook.d.ts","sourceRoot":"","sources":["../../src/tools/moltbook.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,KAAK,QA4BhE"}
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ import { BASE_URL, fetchWithTimeout } from "../client.js";
3
+ import { errorResult } from "./error.js";
4
+ export function register(server, fetchFn) {
5
+ server.registerTool("get_moltbook_digest", {
6
+ description: "Get the latest hourly Moltbook community digest — AI-generated analysis of crypto community sentiment, trending topics, emerging narratives, and hot discussions from the past hour. Returns title, summary, full markdown analysis, sentiment scores, and narrative tracking. Costs $0.005 USDC via x402.",
7
+ }, async () => {
8
+ const res = await fetchWithTimeout(fetchFn, `${BASE_URL}/api/moltbook/digests/latest`);
9
+ if (!res.ok)
10
+ return errorResult(res);
11
+ const data = await res.json();
12
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
13
+ });
14
+ server.registerTool("get_moltbook_history", {
15
+ description: "Get historical Moltbook community digests — hourly sentiment analysis over a configurable lookback window (1-24 hours). Use this to track how community sentiment, topics, and narratives have evolved over time. Returns an array of hourly digest objects. Costs $0.02 USDC via x402.",
16
+ inputSchema: {
17
+ hours: z.number().int().min(1).max(24).optional().describe("How many hours back to look (1-24, default 24)"),
18
+ limit: z.number().int().min(1).max(24).optional().describe("Maximum number of digests to return (1-24, default 24)"),
19
+ },
20
+ }, async ({ hours, limit }) => {
21
+ const params = new URLSearchParams();
22
+ if (hours !== undefined)
23
+ params.set("hours", String(hours));
24
+ if (limit !== undefined)
25
+ params.set("limit", String(limit));
26
+ const url = `${BASE_URL}/api/moltbook/digests${params.size ? "?" + params : ""}`;
27
+ const res = await fetchWithTimeout(fetchFn, url);
28
+ if (!res.ok)
29
+ return errorResult(res);
30
+ const data = await res.json();
31
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
32
+ });
33
+ }
34
+ //# sourceMappingURL=moltbook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moltbook.js","sourceRoot":"","sources":["../../src/tools/moltbook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,OAAqB;IAC/D,MAAM,CAAC,YAAY,CAAC,qBAAqB,EAAE;QACzC,WAAW,EACT,4SAA4S;KAC/S,EAAE,KAAK,IAAI,EAAE;QACZ,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,GAAG,QAAQ,8BAA8B,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,sBAAsB,EAAE;QAC1C,WAAW,EACT,yRAAyR;QAC3R,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YAC5G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;SACrH;KACF,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,GAAG,QAAQ,wBAAwB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjF,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer, fetchFn: typeof fetch): void;
3
+ //# sourceMappingURL=polymarket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polymarket.d.ts","sourceRoot":"","sources":["../../src/tools/polymarket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,KAAK,QAoChE"}
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ import { BASE_URL, fetchWithTimeout } from "../client.js";
3
+ import { errorResult } from "./error.js";
4
+ export function register(server, fetchFn) {
5
+ server.registerTool("get_polymarket_signal", {
6
+ description: "Get a single Polymarket predetermined outcome signal — AI-detected markets where the outcome is already known by insiders (production crews, judges, corporate boards, court officials) before public resolution. Returns confidence level, reasoning, knowledge holder, outcome prices, and market metrics. Costs $0.01 USDC via x402.",
7
+ inputSchema: {
8
+ index: z.number().int().optional().describe("Specific signal index number. Omit to get the latest signal."),
9
+ },
10
+ }, async ({ index }) => {
11
+ const params = new URLSearchParams();
12
+ if (index !== undefined)
13
+ params.set("index", String(index));
14
+ const url = `${BASE_URL}/api/polymarket/signal${params.size ? "?" + params : ""}`;
15
+ const res = await fetchWithTimeout(fetchFn, url);
16
+ if (!res.ok)
17
+ return errorResult(res);
18
+ const data = await res.json();
19
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
20
+ });
21
+ server.registerTool("get_polymarket_signals", {
22
+ description: "Get a batch of Polymarket predetermined outcome signals (up to 20). Supports polling via the 'since' parameter — pass the last seen index to get only new signals. Filter by confidence level. Costs $0.03 USDC via x402.",
23
+ inputSchema: {
24
+ since: z.number().int().optional().describe("Get signals after this index (for polling — pass your last seen index)."),
25
+ count: z.number().int().min(1).max(20).optional().describe("Max signals to return (1-20, default 5)"),
26
+ confidence: z.enum(["high", "medium", "all"]).optional().describe("Filter by confidence: 'high', 'medium', or 'all' (default: 'all')"),
27
+ },
28
+ }, async ({ since, count, confidence }) => {
29
+ const params = new URLSearchParams();
30
+ if (since !== undefined)
31
+ params.set("since", String(since));
32
+ if (count !== undefined)
33
+ params.set("count", String(count));
34
+ if (confidence !== undefined)
35
+ params.set("confidence", confidence);
36
+ const url = `${BASE_URL}/api/polymarket/signals${params.size ? "?" + params : ""}`;
37
+ const res = await fetchWithTimeout(fetchFn, url);
38
+ if (!res.ok)
39
+ return errorResult(res);
40
+ const data = await res.json();
41
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
42
+ });
43
+ }
44
+ //# sourceMappingURL=polymarket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polymarket.js","sourceRoot":"","sources":["../../src/tools/polymarket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function register(server: McpServer, fetchFn: typeof fetch): void;
3
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/tools/tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,KAAK,QAoEhE"}
@@ -0,0 +1,83 @@
1
+ import { z } from "zod";
2
+ import { BASE_URL, fetchWithTimeout } from "../client.js";
3
+ import { errorResult } from "./error.js";
4
+ export function register(server, fetchFn) {
5
+ server.registerTool("get_token_signal", {
6
+ description: "Get a single token intelligence signal — real-time AI analysis of newly launched tokens with hybrid scoring (70% rule-based + 30% LLM), risk assessment, red/green flags, liquidity and volume metrics, social presence, and backtest results. Covers Ethereum, Base, and BSC chains. Costs $0.01 USDC via x402.",
7
+ inputSchema: {
8
+ index: z.number().int().optional().describe("Specific signal index number. Omit to get the latest signal."),
9
+ },
10
+ }, async ({ index }) => {
11
+ const params = new URLSearchParams();
12
+ if (index !== undefined)
13
+ params.set("index", String(index));
14
+ const url = `${BASE_URL}/api/tokens/signal${params.size ? "?" + params : ""}`;
15
+ const res = await fetchWithTimeout(fetchFn, url);
16
+ if (!res.ok)
17
+ return errorResult(res);
18
+ const data = await res.json();
19
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
20
+ });
21
+ server.registerTool("get_token_signals", {
22
+ description: "Get a batch of token intelligence signals (up to 20). Supports polling via 'since' parameter, chain filtering (ethereum/base/bsc), tier filtering (meme for short-term momentum, longterm for sustainable projects), and minimum score threshold. Costs $0.05 USDC via x402.",
23
+ inputSchema: {
24
+ since: z.number().int().optional().describe("Get signals after this index (for polling — pass your last seen index)."),
25
+ count: z.number().int().min(1).max(20).optional().describe("Max signals to return (1-20, default 5)"),
26
+ chain: z.enum(["ethereum", "base", "bsc"]).optional().describe("Filter by chain: 'ethereum', 'base', or 'bsc'"),
27
+ tier: z.enum(["meme", "longterm"]).optional().describe("Filter by tier: 'meme' (short-term momentum) or 'longterm' (sustainable project)"),
28
+ minScore: z.number().int().min(0).max(100).optional().describe("Minimum hybrid score (0-100, default 0)"),
29
+ },
30
+ }, async ({ since, count, chain, tier, minScore }) => {
31
+ const params = new URLSearchParams();
32
+ if (since !== undefined)
33
+ params.set("since", String(since));
34
+ if (count !== undefined)
35
+ params.set("count", String(count));
36
+ if (chain !== undefined)
37
+ params.set("chain", chain);
38
+ if (tier !== undefined)
39
+ params.set("tier", tier);
40
+ if (minScore !== undefined)
41
+ params.set("minScore", String(minScore));
42
+ const url = `${BASE_URL}/api/tokens/signals${params.size ? "?" + params : ""}`;
43
+ const res = await fetchWithTimeout(fetchFn, url);
44
+ if (!res.ok)
45
+ return errorResult(res);
46
+ const data = await res.json();
47
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
48
+ });
49
+ server.registerTool("get_token_history", {
50
+ description: "Get historical token signals by date range (max 7-day window, paginated). Filter by chain, tier, and minimum score. Returns signals with full analysis including backtest results. Costs $0.03 USDC via x402.",
51
+ inputSchema: {
52
+ from: z.string().describe("Start date (ISO 8601 or YYYY-MM-DD), inclusive. Required."),
53
+ to: z.string().optional().describe("End date (ISO 8601 or YYYY-MM-DD), exclusive. Defaults to now."),
54
+ chain: z.enum(["ethereum", "base", "bsc"]).optional().describe("Filter by chain: 'ethereum', 'base', or 'bsc'"),
55
+ tier: z.enum(["meme", "longterm"]).optional().describe("Filter by tier: 'meme' (short-term momentum) or 'longterm' (sustainable project)"),
56
+ minScore: z.number().int().min(0).max(100).optional().describe("Minimum hybrid score (0-100, default 0)"),
57
+ page: z.number().int().min(1).optional().describe("Page number (default 1)"),
58
+ limit: z.number().int().min(1).max(100).optional().describe("Results per page (1-100, default 20)"),
59
+ },
60
+ }, async ({ from, to, chain, tier, minScore, page, limit }) => {
61
+ const params = new URLSearchParams();
62
+ params.set("from", from);
63
+ if (to !== undefined)
64
+ params.set("to", to);
65
+ if (chain !== undefined)
66
+ params.set("chain", chain);
67
+ if (tier !== undefined)
68
+ params.set("tier", tier);
69
+ if (minScore !== undefined)
70
+ params.set("minScore", String(minScore));
71
+ if (page !== undefined)
72
+ params.set("page", String(page));
73
+ if (limit !== undefined)
74
+ params.set("limit", String(limit));
75
+ const url = `${BASE_URL}/api/tokens/history${params.size ? "?" + params : ""}`;
76
+ const res = await fetchWithTimeout(fetchFn, url);
77
+ if (!res.ok)
78
+ return errorResult(res);
79
+ const data = await res.json();
80
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
81
+ });
82
+ }
83
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/tools/tokens.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "moltalyzer-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for Moltalyzer — crypto intelligence, GitHub trends, and prediction market signals via x402 micropayments",
5
+ "type": "module",
6
+ "bin": {
7
+ "moltalyzer-mcp": "./build/index.js"
8
+ },
9
+ "files": [
10
+ "build"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc && chmod +x build/index.js",
14
+ "prepare": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "mcp",
18
+ "moltalyzer",
19
+ "crypto",
20
+ "x402",
21
+ "ai",
22
+ "claude",
23
+ "chatgpt",
24
+ "cursor"
25
+ ],
26
+ "author": "jcislo",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.27.0",
30
+ "@x402/fetch": "^2.5.0",
31
+ "@x402/evm": "^2.4.0",
32
+ "viem": "^2.0.0",
33
+ "zod": "^3.25.0"
34
+ },
35
+ "devDependencies": {
36
+ "typescript": "^5.6.0",
37
+ "@types/node": "^20.0.0"
38
+ }
39
+ }