veriql-mcp 0.0.0-stage → 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 Veriql
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,58 @@
1
- # Temporary Holding Version
1
+ # veriql-mcp
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Crypto wallet and token risk checks as MCP tools, so an agent can ask "is this token safe to buy?" and get an answer with the math attached.
4
+
5
+ Read-only. It never asks for a private key, a seed phrase or a wallet connection, and it never signs or moves anything. Every signal comes from public on-chain data.
6
+
7
+ ## Install
8
+
9
+ Claude Desktop (`claude_desktop_config.json`), Claude Code, Cursor, or any MCP client:
10
+
11
+ ```json
12
+ {
13
+ "mcpServers": {
14
+ "veriql": {
15
+ "command": "npx",
16
+ "args": ["-y", "veriql-mcp"],
17
+ "env": { "VERIQL_API_KEY": "vq_live_your_key" }
18
+ }
19
+ }
20
+ }
21
+ ```
22
+
23
+ Get a free key at [veriql.app/api](https://veriql.app/api). No account, no card.
24
+
25
+ | env | default | |
26
+ | --- | --- | --- |
27
+ | `VERIQL_API_KEY` | (required) | Free or prepaid key |
28
+ | `VERIQL_BASE_URL` | `https://veriql.app` | Point at another deployment |
29
+
30
+ ## Tools
31
+
32
+ **`veriql_scan`** (`address`)
33
+ Risky token approvals for a public wallet across Ethereum, BNB Chain, Polygon, Arbitrum and Base. Returns a 0-100 Security Score with itemised drivers, every risky approval, and a best-effort USD value-at-risk.
34
+
35
+ **`veriql_token`** (`address`, `chainId?`)
36
+ Honeypot, punishing taxes, mintable supply, hidden owner and proxy risks, each as a plain-English flag. EVM chains plus Tron.
37
+
38
+ **`veriql_launch`** (`address`, `chainId?`)
39
+ A 0-100 launch-safety score with every penalty driver and the full metrics behind it. EVM chains plus Tron plus Solana.
40
+
41
+ ## Why the output is shaped like this
42
+
43
+ Agents are the worst possible audience for a bare number, because they cannot tell a measurement from a fallback. So:
44
+
45
+ - **Every score ships its drivers.** You get the penalties and what each one is for, not just the total. The complete scoring methodology, every weight, is published at [veriql.app/llms-full.txt](https://veriql.app/llms-full.txt).
46
+ - **An incomplete check says so.** When a dimension could not be read, the result is marked incomplete and a clean verdict is **withdrawn** rather than reported at a capped number. A partial check that did find danger keeps the finding: incompleteness withdraws a clean verdict and never softens a dirty one.
47
+ - **Absence is never zero.** A value nobody could establish comes back null. It is never substituted from another instrument, because borrowing a number across providers is how a tool reports a collapse that never happened.
48
+ - **Much of it is read from chain, not resold.** Pool reserves (PumpSwap, Orca, Meteora), SPL mint authorities, transfer fees, permanent delegate, LP lock and holder concentration are our own reads, so a vendor outage degrades the answer honestly instead of silently.
49
+
50
+ ## Pay per call, with no account
51
+
52
+ The same endpoints speak [x402](https://veriql.app/api#x402): call with no key, get a `402` describing exactly what to pay, retry with the payment attached. USDC on Base or Solana, no signup and no human in the loop. Useful when an agent has a wallet but cannot complete a checkout.
53
+
54
+ ## Limits, stated plainly
55
+
56
+ A verdict is a structural risk assessment, not financial advice and not a prediction. It cannot tell you whether a price will go up. Holder concentration is an upper bound, because the largest token accounts can include AMM pool vaults and exchange wallets. A clean result means no known risks were found, which is not the same as safe.
57
+
58
+ MIT licensed. Built by the team behind [Veriql](https://veriql.app).
package/dist/core.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ export type V1Endpoint = "scan" | "token" | "launch";
2
+ export interface ClientOpts {
3
+ baseUrl: string;
4
+ apiKey: string;
5
+ fetchImpl?: typeof fetch;
6
+ }
7
+ export interface ApiResult {
8
+ ok: boolean;
9
+ status: number;
10
+ body: any;
11
+ }
12
+ export interface ToolResult {
13
+ content: {
14
+ type: "text";
15
+ text: string;
16
+ }[];
17
+ isError?: boolean;
18
+ [k: string]: unknown;
19
+ }
20
+ /** Compose {base}/api/v1/{endpoint}?params, trimming a trailing slash and dropping empty params. */
21
+ export declare function buildUrl(baseUrl: string, endpoint: V1Endpoint, params: Record<string, string | undefined>): string;
22
+ /** Call the Veriql Risk API with the configured key. Never throws on HTTP status — returns {ok,status,body}. */
23
+ export declare function callVeriql(endpoint: V1Endpoint, params: Record<string, string | undefined>, o: ClientOpts): Promise<ApiResult>;
24
+ /** Map an API result to an MCP tool result (pretty JSON on success; error flag + message otherwise). */
25
+ export declare function toToolResult(r: ApiResult): ToolResult;
package/dist/core.js ADDED
@@ -0,0 +1,26 @@
1
+ // Pure client core for the Veriql MCP server — kept free of the MCP SDK and the
2
+ // network (fetch injected) so it is fully unit-testable. The stdio server
3
+ // (server.ts) is a thin shell that wires these into MCP tools.
4
+ /** Compose {base}/api/v1/{endpoint}?params, trimming a trailing slash and dropping empty params. */
5
+ export function buildUrl(baseUrl, endpoint, params) {
6
+ const u = new URL(`${baseUrl.replace(/\/+$/, "")}/api/v1/${endpoint}`);
7
+ for (const [k, v] of Object.entries(params))
8
+ if (v != null && v !== "")
9
+ u.searchParams.set(k, v);
10
+ return u.toString();
11
+ }
12
+ /** Call the Veriql Risk API with the configured key. Never throws on HTTP status — returns {ok,status,body}. */
13
+ export async function callVeriql(endpoint, params, o) {
14
+ const doFetch = o.fetchImpl ?? fetch;
15
+ const res = await doFetch(buildUrl(o.baseUrl, endpoint, params), { headers: { "x-api-key": o.apiKey } });
16
+ const body = await res.json().catch(() => ({}));
17
+ return { ok: res.ok, status: res.status, body };
18
+ }
19
+ /** Map an API result to an MCP tool result (pretty JSON on success; error flag + message otherwise). */
20
+ export function toToolResult(r) {
21
+ if (r.ok)
22
+ return { content: [{ type: "text", text: JSON.stringify(r.body, null, 2) }] };
23
+ const msg = r.body?.error?.message || `Request failed (HTTP ${r.status}).`;
24
+ return { content: [{ type: "text", text: `Error ${r.status}: ${msg}` }], isError: true };
25
+ }
26
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/mcp/core.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,0EAA0E;AAC1E,+DAA+D;AAsB/D,oGAAoG;AACpG,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,QAAoB,EAAE,MAA0C;IACxG,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;IACvE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;YAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,gHAAgH;AAChH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAoB,EACpB,MAA0C,EAC1C,CAAa;IAEb,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzG,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,YAAY,CAAC,CAAY;IACvC,IAAI,CAAC,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACxF,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,wBAAwB,CAAC,CAAC,MAAM,IAAI,CAAC;IAC3E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/server.js ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ // Veriql Risk API — MCP server. Exposes the read-only risk engine as three MCP
3
+ // tools so AI agents / Claude / Cursor can call it directly. A thin shell over
4
+ // src/mcp/core.ts (all logic + tests live there); calls the public HTTP API with
5
+ // the operator's key, so every agent call stays metered by the credits system.
6
+ //
7
+ // Config (env, set in your MCP client): VERIQL_API_KEY (get a free key at
8
+ // https://veriql.app/api), optional VERIQL_BASE_URL (default https://veriql.app).
9
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
11
+ import { z } from "zod";
12
+ import { callVeriql, toToolResult } from "./core.js";
13
+ const baseUrl = process.env.VERIQL_BASE_URL || "https://veriql.app";
14
+ const apiKey = process.env.VERIQL_API_KEY || "";
15
+ const needKey = () => ({
16
+ content: [{ type: "text", text: "Set VERIQL_API_KEY to use this tool — get a free key at https://veriql.app/api" }],
17
+ isError: true,
18
+ });
19
+ const server = new McpServer({ name: "veriql-risk", version: "1.0.0" });
20
+ server.registerTool("veriql_scan", {
21
+ title: "Veriql wallet scan",
22
+ description: "Scan a public wallet address for risky token approvals across 5 EVM chains (Ethereum, BNB Chain, Polygon, Arbitrum, Base). Returns a 0–100 Security Score with itemised drivers, every risky approval, and a best-effort USD value-at-risk.",
23
+ inputSchema: { address: z.string().describe("Public EVM address, 0x…") },
24
+ }, async ({ address }) => (apiKey ? toToolResult(await callVeriql("scan", { address }, { baseUrl, apiKey })) : needKey()));
25
+ server.registerTool("veriql_token", {
26
+ title: "Veriql token check",
27
+ description: "Check a token contract for honeypot, punishing taxes, mintable supply, hidden owner and proxy risks — each surfaced as a plain-English flag. EVM chains + Tron.",
28
+ inputSchema: {
29
+ address: z.string().describe("Token contract address"),
30
+ chainId: z.string().optional().describe("Chain id or key (e.g. 1, base, tron); defaults to Ethereum"),
31
+ },
32
+ }, async ({ address, chainId }) => apiKey ? toToolResult(await callVeriql("token", { address, chainId }, { baseUrl, apiKey })) : needKey());
33
+ server.registerTool("veriql_launch", {
34
+ title: "Veriql launch-safety score",
35
+ description: "A transparent 0–100 launch-safety score for a token/mint with itemised penalty drivers and full metrics. EVM chains + Tron + Solana.",
36
+ inputSchema: {
37
+ address: z.string().describe("Token contract / mint address"),
38
+ chainId: z.string().optional().describe("Chain id or key (e.g. 1, base, solana); defaults to Ethereum"),
39
+ },
40
+ }, async ({ address, chainId }) => apiKey ? toToolResult(await callVeriql("launch", { address, chainId }, { baseUrl, apiKey })) : needKey());
41
+ async function main() {
42
+ const transport = new StdioServerTransport();
43
+ await server.connect(transport);
44
+ // stdout is the MCP channel — log to stderr only.
45
+ console.error(`veriql-risk MCP ready (base ${baseUrl}, key ${apiKey ? "set" : "MISSING — set VERIQL_API_KEY"})`);
46
+ }
47
+ main().catch((e) => {
48
+ console.error("veriql mcp fatal:", e);
49
+ process.exit(1);
50
+ });
51
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,53 @@
1
1
  {
2
2
  "name": "veriql-mcp",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0",
4
+ "description": "Veriql Risk API as MCP tools: wallet approval scans, token honeypot/tax checks and a transparent 0-100 launch-safety score, for Claude, Cursor and any MCP agent.",
5
+ "keywords": [
6
+ "mcp",
7
+ "model-context-protocol",
8
+ "crypto",
9
+ "solana",
10
+ "ethereum",
11
+ "security",
12
+ "honeypot",
13
+ "rug-check",
14
+ "token-safety",
15
+ "wallet-security",
16
+ "web3",
17
+ "claude",
18
+ "cursor"
19
+ ],
20
+ "homepage": "https://veriql.app/api",
21
+ "license": "MIT",
22
+ "type": "module",
23
+ "bin": {
24
+ "veriql-mcp": "dist/server.js"
25
+ },
26
+ "main": "dist/core.js",
27
+ "types": "dist/core.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "types": "./dist/core.d.ts",
31
+ "default": "./dist/core.js"
32
+ }
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "engines": {
40
+ "node": ">=18"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc -p tsconfig.json",
44
+ "prepublishOnly": "npm run build"
45
+ },
46
+ "dependencies": {
47
+ "@modelcontextprotocol/sdk": "^1.30.0",
48
+ "zod": "^4.6.5"
49
+ },
50
+ "devDependencies": {
51
+ "typescript": "^5.6.0"
52
+ }
53
+ }