Skip to main content
Glama
abetoots

tokensift

Official
by abetoots

tokensift

Read-only token due-diligence over keyless public APIs, as one Python package that is both an importable library and a stdio MCP server. Six tools, one envelope, no trading, no secrets.

Tool

Upstream

Chains

honeypot_check

honeypot.is buy/sell simulation

ethereum, bsc, base

rugcheck_report

rugcheck.xyz risk report

solana

dex_search

DexScreener search

all

dex_token_pairs

DexScreener pools for a token

ethereum, bsc, base, solana

dex_pair

DexScreener pair snapshot

ethereum, bsc, base, solana

jupiter_prices

Jupiter Price v3 (lite host)

solana

Every call returns the same envelope (also each tool's outputSchema):

{"ok": true, "source": {"provider": "dexscreener", "url": "…exact GET…", "chain": "solana"},
 "fetched_at": "2026-09-06T12:00:00Z", "cache": {"hit": false, "ttl_s": 30},
 "summary": {…}, "raw": null, "raw_truncated": false, "error": null}

On failure ok is false, summary is null, and error carries type (invalid_input | not_found | rate_limited | upstream_unavailable | upstream_changed), message, optional retry_after_s, and advice written for the model. The MCP tool returns the same envelope with isError=true.

Library

from tokensift import Tokensift

async with Tokensift() as ts:
    env = await ts.honeypot_check("base", "0x…")
    if env.ok:
        print(env.summary["is_honeypot"], env.summary["sell_tax"])

Related MCP server: Cabal-Hunter

MCP server

uvx --from /path/to/tokensift tokensift-mcp      # stdio

See docs/REGISTRATION.md for Claude Code, Codex CLI, and Gemini CLI entries and the Inspector smoke test.

Behavior that matters

  • Validation before network: chain aliases (eth, 1, bnb, 56, 8453, sol) and address formats are checked first; bad input never hits an upstream.

  • Per-provider token buckets (TOKENSIFT_RPM_*). When a bucket is empty the call waits up to TOKENSIFT_LIMITER_WAIT_S (5 s) and then returns rate_limited with retry_after_s. rate_limited and upstream_unavailable are never cached; invalid_input and not_found are cached for TOKENSIFT_NEG_CACHE_TTL_S (10 s).

  • Successful responses are cached for TOKENSIFT_CACHE_TTL_S (30 s) keyed by provider, endpoint, and normalized params.

  • One retry on 429/502/503/504 honoring Retry-After, capped at 5 s. Timeouts and 401/403 become upstream_unavailable (403 advice names the datacenter-IP possibility).

  • raw is returned only with verbose=true, capped at TOKENSIFT_RAW_MAX_BYTES (32 kB) with raw_truncated=true when cut.

  • Logging goes to stderr only; stdout is the MCP wire.

  • Dual-era: the server answers both a legacy initialize handshake and modern 2026-07-28 per-request metadata (tested over a real pipe).

Development

uv sync
uv run pytest                 # unit + client + server + contract + stdio (no network)
uv run pytest -m live         # one real call per upstream; run weekly
uv run python scripts/record_fixtures.py   # refresh recorded upstream fixtures
npx -y @modelcontextprotocol/inspector --cli ./scripts/serve-stdio.sh --method tools/list   # flag-free launcher: the inspector cli eats `--from`

Stack (pinned 2026-09-06): fastmcp>=4.0,<4.1 on mcp 2.x (spec 2026-07-28), httpx2, pydantic-settings, aiolimiter, cachetools. Python 3.12 via uv.

T0 spike findings (2026-09-06)

  • fastmcp.tools.ToolResult(content, structured_content, meta, is_error) accepts is_error with structured content, so errors are returned as results, never raised (a raised exception becomes a JSON-RPC error in mcp 2.x).

  • mcp.server.runner drives serve_dual_era_loop; a legacy initialize is handled inline and negotiated from HANDSHAKE_PROTOCOL_VERSIONS. tests/test_stdio.py proves both handshakes over a pipe.

  • The Envelope field ok forbids a classmethod of the same name; factories are Envelope.success / Envelope.failed.

  • MCP Inspector CLI v2 parses flags anywhere on its command line, so a target like uvx --from … tokensift-mcp loses --from and reports "Connection closed". scripts/serve-stdio.sh is a flag-free launcher for the Inspector; the three CLIs pass args through correctly and use uvx directly.

Available Tools

6 tools
dex_pairDexScreener pair snapshotA
Read-onlyIdempotent

live snapshot of one dexscreener pair: price, liquidity, fdv, market cap, 24h volume and txns, price change windows, project links and boosts. chains: chain id or alias; supported: ethereum (aliases: eth, 1); bsc (aliases: bnb, 56); base (aliases: 8453); solana (aliases: sol). not_found means no such pair on that chain. verbose=true adds the raw payload.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainYeschain id or alias; supported: ethereum (aliases: eth, 1); bsc (aliases: bnb, 56); base (aliases: 8453); solana (aliases: sol)
verboseNowhen true, include the raw upstream payload under `raw` (capped) and extra detail in summary
pair_addressYespair/pool address in the chain's format

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
rawNo
cacheNo
errorNo
sourceYes
summaryNo
fetched_atNo
raw_truncatedNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds useful behavioral context beyond that: it is a live snapshot, not_found has a defined meaning, and verbose=true includes the raw upstream payload. These details help the agent understand observable behavior without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loads the core purpose before listing supported chains and behavioral notes. Each sentence contributes useful information, though the chain-alias enumeration is duplicated in the schema and makes the description slightly dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to explain return values. It covers supported chains, aliases, required pair address, not_found semantics, and the verbose flag, which is sufficient for correct invocation of a read-only snapshot tool. It could be more complete by naming sibling distinctions, but nothing essential for calling this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all three parameters already described in the input schema. The description mostly repeats the chain aliases and verbose behavior rather than adding substantial new parameter-level meaning; the only slight addition is the not_found error semantics, which is more about output behavior than parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a live snapshot of one DexScreener pair and enumerates the fields included (price, liquidity, FDV, market cap, 24h volume, txns, price change windows, links, boosts). It identifies the resource and verb specifically, but it does not explicitly contrast itself with sibling tools like dex_search or dex_token_pairs, so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the caller what inputs are needed (chain plus pair address), which chains/aliases are supported, and what not_found means. It does not explicitly state when to use this tool versus alternatives such as dex_search or jupiter_prices, so usage guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dex_token_pairsDexScreener pools for a tokenA
Read-onlyIdempotent

list dexscreener pools for one token contract on one chain, sorted by liquidity descending, with price, liquidity, fdv, volume, txns and pair age. chains: chain id or alias; supported: ethereum (aliases: eth, 1); bsc (aliases: bnb, 56); base (aliases: 8453); solana (aliases: sol). limit 1-30 (default 20). an empty list means dexscreener does not index the token on that chain. verbose=true adds the raw payload.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainYeschain id or alias; supported: ethereum (aliases: eth, 1); bsc (aliases: bnb, 56); base (aliases: 8453); solana (aliases: sol)
limitNomax pools to return, 1-30
verboseNowhen true, include the raw upstream payload under `raw` (capped) and extra detail in summary
token_addressYestoken contract address in the chain's format

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
rawNo
cacheNo
errorNo
sourceYes
summaryNo
fetched_atNo
raw_truncatedNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive behavior. The description adds useful behavioral context beyond that: results are sorted by liquidity descending, an empty list means the token is not indexed on that chain, and verbose=true exposes the raw upstream payload. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: action, scope, sort order, output fields, chain support, limits, and edge-case behavior each get one clause. There is no filler or redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and well-covered by the input schema and output schema. The description supplies the missing runtime context: supported chains, default/max limit, empty-list interpretation, and verbose behavior. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description restates chain aliases and limit/verbose behavior, but adds little beyond what the parameter descriptions already provide. It does not deepen understanding of token_address formats or how parameters interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and resource: 'list dexscreener pools for one token contract on one chain,' and names the returned fields. It is clearly scoped to token-level pool listing, which distinguishes it from sibling tools like dex_search and dex_pair.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear invocation context: one chain, one token contract, sorted by liquidity, with a meaningful empty-list behavior. It does not explicitly name sibling alternatives or state when not to use the tool, but the context is unambiguous enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

honeypot_checkHoneypot simulation (EVM)A
Read-onlyIdempotent

simulate a buy and sell of an evm token via honeypot.is and report is_honeypot, buy/sell/transfer tax, gas, risk flags, pair liquidity, contract open-source/proxy status and holder count. chains: ethereum, bsc, base (chain id or alias; supported: ethereum (aliases: eth, 1); bsc (aliases: bnb, 56); base (aliases: 8453); solana (aliases: sol)); for solana use rugcheck_report. no result means the token has no simulated pair yet. verbose=true adds top holders with supply percentages and the raw payload.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainYeschain id or alias; supported: ethereum (aliases: eth, 1); bsc (aliases: bnb, 56); base (aliases: 8453); solana (aliases: sol)
addressYestoken contract address (0x + 40 hex)
verboseNowhen true, include the raw upstream payload under `raw` (capped) and extra detail in summary

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
rawNo
cacheNo
errorNo
sourceYes
summaryNo
fetched_atNo
raw_truncatedNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, covering safety. The description adds behavioral context beyond these: it describes the simulation nature (not a real transaction), the meaning of empty results, and the effect of verbose=true (adds top holders and raw payload). This fully discloses behavior without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but each sentence contributes value. It front-loads the core purpose, then provides chain details, a routing note, and verbose behavior. It is slightly redundant (aliases are repeated in schema), but remains well-structured and avoids fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex (multiple chains, external service, optional verbose), and the description covers all necessary aspects: purpose, supported inputs, routing to alternatives, edge-case behavior (no pair), and output enhancement. An output schema exists, so return structure is covered elsewhere. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are already documented. The description adds extra semantic value by explaining that verbose=true includes top holders with supply percentages and raw payload, and by reiterating the chain aliases in a readable format. It goes beyond the schema's minimal descriptions, though some duplication exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool simulates a buy and sell of an EVM token via honeypot.is and enumerates the specific metrics it reports (is_honeypot, taxes, gas, risk flags, etc.). It names the exact resource and action, and differentiates from sibling rugcheck_report by explicitly directing Solana usage there.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states supported chains (ethereum, bsc, base) with aliases and instructs to use rugcheck_report for Solana, providing clear routing. It also clarifies that a null result means no simulated pair exists, which guides interpretation of the tool's output.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

jupiter_pricesJupiter prices (Solana)A
Read-onlyIdempotent

usd prices for up to 50 solana mints from jupiter price v3 (swap-derived), with liquidity, 24h change and decimals; unknown mints come back with found=false. use as a second price source next to dexscreener. verbose=true adds the raw payload.

ParametersJSON Schema
NameRequiredDescriptionDefault
mintsYes1-50 solana mint addresses
verboseNowhen true, include the raw upstream payload under `raw` (capped) and extra detail in summary

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
rawNo
cacheNo
errorNo
sourceYes
summaryNo
fetched_atNo
raw_truncatedNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses useful edge-case behavior: unknown mints come back with found=false, a 50-mint limit exists, and verbose=true adds the raw payload. These details help the agent predict behavior; no contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two dense sentences with no filler. Purpose, limits, edge behavior, and usage context are all front-loaded economically.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema and complete parameter documentation, the description covers purpose, source, limits, edge cases, and verbose behavior. It could be slightly stronger with an explicit when-not-to-use note, but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description mostly restates what the schema already says: up to 50 mint addresses and verbose adding raw payload. It adds no genuinely new parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns USD prices for up to 50 Solana mints from Jupiter, with liquidity, 24h change, decimals, and found=false for unknown mints. It identifies itself as a price source alongside dexscreener, but does not explicitly contrast with sibling tools like dex_search or dex_token_pairs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit use context: 'use as a second price source next to dexscreener.' However, it does not state when not to use this tool or name specific sibling alternatives, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rugcheck_reportRugCheck report (Solana)A
Read-onlyIdempotent

fetch rugcheck.xyz's risk report for a solana mint: score and normalised score, named risks with levels, lp locked percentage, token program. verbose=true fetches the full report: mint/freeze authority, top holders with percentages and insider flags, metadata mutability, jupiter verification, and the raw payload. solana only; for evm tokens use honeypot_check.

ParametersJSON Schema
NameRequiredDescriptionDefault
mintYessolana mint address (base58)
verboseNowhen true, include the raw upstream payload under `raw` (capped) and extra detail in summary

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
rawNo
cacheNo
errorNo
sourceYes
summaryNo
fetched_atNo
raw_truncatedNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnly/openWorld/idempotent/non-destructive safety context. The description adds useful behavioral detail beyond those annotations, such as what default vs verbose mode returns, including the capped raw payload. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences, front-loaded with the core action and output summary, then enriched with verbose-mode details and platform constraint. Every sentence earns its place without repeating structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, full parameter coverage, and strong annotations, the description covers purpose, mode behavior, result contents, and platform routing. Nothing essential is missing for correct tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3. The description adds value beyond the schema by enumerating verbose-mode fields like mint/freeze authority, top holders with insider flags, metadata mutability, and Jupiter verification that the schema does not list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action and resource: "fetch rugcheck.xyz's risk report for a solana mint" and enumerates the report's fields. It also explicitly distinguishes itself from honeypot_check by stating "solana only."

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear routing guidance: use for Solana mint risk reports, use verbose=true for richer detail, and use honeypot_check for EVM tokens. This directly tells an agent when to use this tool vs alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observeddex_pair
    • First observeddex_search
    • First observeddex_token_pairs
    • First observedhoneypot_check
    • First observedjupiter_prices
    • First observedrugcheck_report

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation4/5

Tools are mostly distinct: honeypot_check and rugcheck_report clearly separate EVM vs Solana safety checks; dex_search, dex_token_pairs, and dex_pair cover different granularities of pair data. Minor overlap exists between dex_search and dex_token_pairs, but descriptions clarify when each is appropriate.

Naming Consistency5/5

All tool names use consistent snake_case and follow a predictable pattern: domain-specific prefix (dex_, jupiter_, honeypot_, rugcheck_) plus a clear noun or verb. The naming scheme makes the tool's function obvious and uniform across the set.

Tool Count5/5

Six tools is a well-scoped size for a token research and safety-checking server. Each tool covers a distinct aspect of the workflow (search, pair lookup, pair snapshot, safety verification, pricing) without redundancy or bloat.

Completeness4/5

The core workflow (find token, verify pair, assess safety, get price) is covered. Minor gaps exist: no EVM-specific price source analogous to jupiter_prices, and dex_token_pairs only queries one chain at a time, requiring multiple calls for cross-chain analysis.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Provides post-deploy Solana threat intelligence, enabling AI agents to check operators, tokens, and network stats for detecting rug pulls and malicious activity.
    5
    16 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    On-chain Solana token safety for trading agents — traces coordinated wallet funding, same-block Jito bundles, serial-rug deployers and live coordinated dumps into one Exit-Liquidity Risk verdict before a swap. Free tier, then $0.02 USDC/query via x402.
    1
    18 npm
    1
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Provides on-chain forensic checks for evaluating transaction risks, including token verification, rug-pull detection, and fund tracing, using public blockchain endpoints.
    12
    16 npm
    MIT
  • F
    license
    A
    quality
    B
    maintenance
    Enables read-only on-chain analysis to spot trending and new memecoin pools, evaluate rug risk, and surface early buyer wallets across Solana, Base, and Ethereum.
    5
    -