Skip to main content
Glama
ijgc1020

deployer-reputation-mcp

Deployer Reputation: supplied-edge heuristic

Group launch records by funding associations and inspect explainable heuristic scores. Bring your own deployer, funder, and mint edges. This product does not fetch Solana RPC data, look up wallets, discover funding transactions, or verify caller labels.

Use it after your data pipeline has resolved launch and funding provenance. A token-address list, price feed, or generic token-scanner dataset is not enough. Shared funding is an association, not verified common ownership. Scores are not fraud findings, predictions, probabilities, or investment recommendations. Low does not mean safe.

  • Run on Apify: $0.005 per delivered analysis batch, up to 1,000 edges.

  • Source and reusable examples: local scoring and MCP stdio use Python's standard library, without an Apify account or charge.

  • Tender CSV/JSON audit workflows: separate procurement companion with stage checks and an offline SHA-256 receipt verifier. It does not use Solana scoring; integrations remain schema candidates until tested with real upstream data.

Check workflow fit before running

Choose the right tool and request a workflow-fit check. Use public documentation or synthetic field names only; GitHub issues are public. No credentials, private datasets, or billing receipts. No purchase required to ask.

Related MCP server: RugSense

First result in five minutes

Option A: Apify, no local installation

  1. Open the Actor and switch its input to JSON.

  2. Replace the complete input with this fictional example. These identifiers are not real wallets or mints.

{
  "operation": "score",
  "edges": [
    {"deployer": "DemoDeployerA", "funder": "DemoSharedFunder", "mint": "DemoMintA", "outcome": "unknown"},
    {"deployer": "DemoDeployerB", "funder": "DemoSharedFunder", "mint": "DemoMintB", "outcome": "unknown"},
    {"deployer": "DemoDeployerC", "funder": "DemoOtherFunder", "mint": "DemoMintC", "outcome": "unknown"}
  ]
}
  1. Check current Store pricing before starting. This example produces one $0.005 analysis result, not three charges.

  2. Set the run's maximum total charge to $0.01 (maxTotalChargeUsd for API callers), then start it.

  3. Open the run's default dataset and view or download its JSON. There is one result object containing nested clusters.

Expected from this fictional input: n_edges: 3, n_clusters: 2. A and B group through DemoSharedFunder; C stays separate. Both clusters have evidence.labelCoverage: 0, observed_rug_rate: null, and rug_rate_wilson_lb: null. Missing labels do not establish a zero rug rate. A structural score can still be nonzero; it is not a safety verdict.

The same input is saved as examples/apify_input/reputation_first_run.json in the source repository. The dataset, not a key-value OUTPUT record, is the result destination. A successful process exit alone does not prove delivery or payment.

Option B: offline, no account or network call

Install Python 3.13 and download or clone the source repository. Run this command from its root; no pip install is needed for inline scoring or MCP stdio:

python -c "import json; from pathlib import Path; from actor import run_input; print(json.dumps(run_input(json.loads(Path('examples/apify_input/reputation_first_run.json').read_text(encoding='utf-8'))), indent=2))"

This calls the real shared Actor input/scoring function, without launching an Apify run. All bundled demonstration identifiers and labels are fictional. They demonstrate software behavior, not actual wallets, model accuracy, customer demand, or profitable trading.

Your input: one observed launch per edge

An edge means the supplied funder seeded the supplied deployer, which launched the supplied mint. You must resolve those relationships before calling this product. Keep transaction references, source URLs, observation times, and label policy in your own evidence store, keyed by mint. Extra provenance fields cannot be included in an edge: unknown fields are rejected.

Field

Contract

Your responsibility

deployer

Required nonempty string

Identify the launch deployer from evidence; a token holder or swap wallet is not a substitute.

funder

Required nonempty string

Resolve funding of that deployer before the launch. Do not substitute a pool address, mint, or common unknown placeholder.

mint

Required nonempty string; unique within the batch

Supply the launched token identifier, not its trading-pair address.

outcome

Optional: unknown (default), rug, rugged, alive, graduated

Supply only supported labels you can substantiate. rugged maps to rug. Missing evidence stays unknown.

funder_is_cex

Optional strict boolean; default false

Mark known exchange/infrastructure funders. The default is not verification that a wallet is non-exchange.

lamports

Optional integer, 0–18446744073709551615; default 0

Funding amount in lamports, not SOL or a numeric string. Currently does not affect the score.

block_time

Optional Unix timestamp in seconds, 0–253402300799, or null

Do not pass an ISO date or milliseconds. Currently does not affect the score.

Identifiers are opaque strings of at most 128 characters, without whitespace, control characters, or Unicode surrogates. They are not validated as Solana addresses. Preserve exact identifier spelling. If a required deployer or funder is missing, keep that launch in your enrichment queue; do not invent an edge.

Batches require 1–1,000 edges with distinct mints. Missing, duplicate, or conflicting mints reject the whole batch. Multiple funding observations for one mint must be resolved upstream into one supported edge under your documented selection rule; this is not a general transaction-graph importer.

HTTP and local MCP tool arguments contain only {"edges": [...]}. Apify input also accepts operation (score by default, or cluster), datasetId, and payload. Inline Actor input, HTTP bodies, and individual stdio lines are limited to 512000 bytes; the edge-count limit applies independently to inline and dataset inputs.

Read the result before using the score

score returns clusters, n_clusters, n_edges, model, scorerVersion, clusterIdVersion, and caveat. Clusters are ordered by descending heuristic score.

Cluster field

Interpretation

cluster_id

CL2- plus SHA-256 of supplied deployer/funder membership. An association key, not a persistent operator identity.

deployers, funders, mints, n_launches

Membership and launch counts within this batch only.

score, band

Uncalibrated 0–1 heuristic and policy band: low, elevated, or high. A score of 0.6 does not mean 60% fraud probability.

components

serial, cadence, fanout, cex, and rugs: the component values behind the score.

evidence.labeled_launches, rug_launches, labelCoverage

Caller-supplied label counts and labeled/total launch fraction. Check these before interpreting the band.

evidence.observed_rug_rate, rug_rate_wilson_lb

Statistics over supplied labeled launches only; both are null with no labels. Not population-level fraud estimates.

evidence.notes, rug_evidence

Missing/incomplete outcome warnings and the low-is-not-safe caveat.

Structural components can raise scores without outcome labels. cadence measures launch count, not elapsed time. high requires a score of at least 0.50 and a positive supplied rug label; otherwise a score of at least 0.28 is elevated. These thresholds are policy, not calibrated risk levels. The inherited CEX component is a heuristic, not evidence of misconduct.

A funder flagged funder_is_cex: true anywhere in the batch never joins distinct deployers through that funder. The same deployer's launches can still group together. Funding associations can be transitive. No chain lookup verifies any of this. Separate research AUC, lift, or p-values do not validate this scorer. No performance, predictive-accuracy, or profitability claim is made.

cluster returns only membership groups, counts, and clusterIdVersion; it does not return scores, bands, or label evidence. Both operations deliver one dataset object per Actor run.

Repeat use: refresh evidence, not just the score

Each call is stateless. The Actor does not remember prior launches, append historical evidence, refresh outcomes, or watch wallets. Re-running identical input does not collect new information.

For a scheduled review workflow:

  1. Collect new launch/funding evidence in your own pipeline. Resolve exchange flags and outcome labels there.

  2. Rebuild your chosen analysis snapshot, including relevant older launches. Replace old rows when labels change; never append duplicate mints.

  3. Project only the documented fields. Record the snapshot time, source coverage, and label policy outside the Actor input.

  4. Keep related deployers and non-exchange funding groups together when dividing work into batches of at most 1,000 edges.

  5. Run one batch per input or dataset. Save the result, input snapshot, scorer version, and Apify run/dataset IDs together.

  6. Compare membership, evidence coverage, and components before treating a score change as meaningful.

Arbitrary chunks can split a funding group and change scores. Separate batches are never joined later by this product. If a connected analysis set exceeds 1,000 edges, this interface cannot analyze that whole set in one call; document the coverage reduction rather than claiming a full-graph result.

Runnable fictional refresh

examples/apify_input/reputation_repeat.json retains the first-run snapshot, adds DemoMintD from existing DemoDeployerA, and changes DemoMintA to a fictional rugged label. No real event is claimed.

python -c "import json; from pathlib import Path; from actor import run_input; print(json.dumps(run_input(json.loads(Path('examples/apify_input/reputation_repeat.json').read_text(encoding='utf-8'))), indent=2))"

Expected: four edges and two clusters. The shared-funder cluster now contains three launches, one supplied rug label, and labelCoverage: 0.3333. Both cluster IDs stay unchanged because their deployer/funder membership is unchanged. Adding/removing a deployer or funder can change IDs; changing only mints or outcomes does not. Use mint membership to reconcile changed groups across snapshots.

For Apify, paste this repeat file as the next run's complete JSON input. Each delivered refresh is another analysis result, including when it repeats earlier input. Existing reputation_score.json and reputation_cluster.json provide fictional labeled and exchange-separation examples.

Dataset handoff: transport support is not schema compatibility

The Actor can read already-enriched edge rows from an Apify dataset. Each dataset item must be one edge object, not an edges wrapper or a previous score result. The dataset must contain 1–1,000 rows; fetching pages does not split it into multiple analysis batches.

For a manual handoff, replace YOUR_DATASET_ID below with the real dataset ID, not its URL:

{"datasetId": "YOUR_DATASET_ID", "operation": "score"}

Remove edges entirely, including the form's fictional prefill. Non-null inline edges take precedence over every dataset reference; even an empty list fails instead of falling back. Explicit datasetId takes precedence over payload.resource.defaultDatasetId.

For an Actor-to-Actor integration, select run succeeded as the trigger on your enrichment Actor. Set this static input with no edges or datasetId:

{"operation": "score"}

Apify adds payload.resource.defaultDatasetId for the triggering run. Alternatively, the integration form can interpolate an explicit reference:

{"datasetId": "{{resource.defaultDatasetId}}", "operation": "score"}

That expression works in the integration form, not as a literal dataset ID in a manual/API call. The reader accepts alphanumeric Apify IDs of 10–32 characters, never arbitrary caller URLs or credentials. It tries dataset access without a token first, then the Actor's run token on an authorization failure. LIMITED_PERMISSIONS does not guarantee access to another dataset. If access is denied, either grant appropriate storage access or share that specific dataset by link only when disclosure is acceptable. Do not make sensitive data public just to clear an error.

A saved task with a fixed dataset ID keeps reading that same dataset. Use the integration's dynamic run dataset or update the task input before scheduling a new snapshot. This Actor performs no enrichment.

Published upstream schema audit

Schema descriptions inspected on 2026-09-22; no live upstream runs or end-to-end compatibility certification:

Upstream product

Published fields

Missing work before this Actor

Pump.fun New Token Listings Scraper

mint, creator, ISO launchTimestamp, market/listing fields

No funder. Verify what creator means, resolve the deployer and its pre-launch funding, then project the supported fields. Do not assume creator is an evidenced deployer.

DexScreener Scraper

baseToken.address, pairAddress, prices, volume, liquidity, pairCreatedAt

No deployer/funder edge. Resolve both from independent evidence; distinguish mint from pair. Price/volume fields and pair timestamps are not funding provenance.

Neither published schema supports direct dataset pass-through. A field rename cannot manufacture missing funding evidence. Unknown extra fields also cause rejection. A compatible handoff requires an upstream enrichment/projection step and a check of actual output rows; no built-in scanner adapter is provided.

Cost per batch and per repeat

The Store listed $5.00 per 1,000 analysis results on 2026-09-22: $0.005 per delivered batch, not per edge and not per nested cluster. Platform pricing is configured outside this source; check the Store before each workflow launch. Apify's current pricing and credit terms govern actual charges.

Edges in one batch

Analysis-result price

Effective price per edge

1

$0.005

$0.005

100

$0.005

$0.00005

1,000

$0.005

$0.000005

One delivered batch per day for 30 days is $0.15 at that rate. Thirty separate runs with the same input still produce thirty billable results. Both score and cluster use the same one-result delivery. Upstream scraping, RPC, enrichment, and your own hosting costs are not included in this comparison.

The Actor publishes only through the default dataset, using the platform's synthetic apify-default-dataset-item event. It adds no custom duplicate charge. Rejected input produces no analysis-result item. Inspect both dataset delivery and platform charge records; neither owner test runs nor the displayed unit price establish seller revenue. Apify stores submitted input/output; account/platform access and retention rules apply.

MCP quickstart: local stdio, no hosted service required

The local server uses Python's standard library. No HTTP/Actor dependencies, API key, RPC endpoint, or Apify account is needed. Start it from the repository root:

python deployer_reputation_mcp.py

It waits for JSON-RPC input; there is no banner or HTTP listener. Your MCP client normally starts this process. Copy mcp-client-config.json into your client's MCP configuration and replace {{INSTALL_DIR}} with the absolute repository path. For example, a checkout in C:/tools/deployer-reputation-mcp uses:

{
  "mcpServers": {
    "deployer-reputation": {
      "command": "python",
      "args": ["C:/tools/deployer-reputation-mcp/deployer_reputation_mcp.py"]
    }
  }
}

Use your real path, and the full Python executable path if the client cannot find python. The script resolves its bundled scorer relative to itself, not the client's working directory.

Tools: deployer_reputation and cluster_launches. Both accept only {"edges": [...]}; Actor-only operation, datasetId, and payload are not local MCP arguments. The server negotiates 2025-11-25 or 2025-06-18 for structured results, and still supports 2024-11-05 with text-only results. An unsupported requested revision receives 2025-11-25; a client that does not support that revision must disconnect. Transport remains one newline-delimited JSON-RPC object per line, limited to 512000 bytes including envelope and newline. JSON-RPC batch arrays and HTTP/SSE transport are not implemented.

Executable handshake and calls

examples/mcp_quickstart.jsonl includes initialization, the initialized notification, tool discovery, a score call, a grouping call, a deliberately incomplete edge, and a final ping. All data is fictional.

PowerShell, from the repository root:

Get-Content examples/mcp_quickstart.jsonl | python deployer_reputation_mcp.py

POSIX shell:

python deployer_reputation_mcp.py < examples/mcp_quickstart.jsonl

Expected replies:

Request ID

Result

1

Initialization reports server deployer-reputation, version 2.1.0, protocol 2025-11-25. Scoring policy remains 2.0.0.

2

tools/list exposes two tools with input schemas, complete output schemas, and read-only/local-computation annotations.

3

Successful score call: three edges, two clusters, no outcome labels.

4

Successful grouping call: two clusters, no scores.

5

Intentional negative control: mint-only input returns result.isError: true, not a fabricated deployer/funder or score.

6

Ping returns an empty result object, demonstrating recovery after rejected input.

Notifications produce no reply. Successful calls have result.isError: false; the JSON object is in result.structuredContent and is also serialized in result.content[0].text. The output schema describes the object, not a JSON-encoded string. Grouping-only output has no score fields. For request 5, isError is true and both representations contain {"error": "<input rejection reason>"}; no partial analysis is returned. The schemas include this error alternative and nullable outcome rates. Unknown tools and malformed protocol envelopes instead return JSON-RPC error objects.

A client explicitly requesting 2024-11-05 retains the original interface: no outputSchema or annotations in discovery, JSON-encoded success in content[0].text, plain-text input errors, and no structuredContent. Malformed requests do not stop either version's stream. Invalid input must be corrected before retrying; duplicate mints reject the batch. JSON Schema cannot express unique values of only the mint property, or distinguish integer tokens from 1.0/1e0; runtime validation does.

Apify's hosted MCP configuration is a separate route to the cloud Actor, with OAuth sign-in and normal Actor pricing. Local stdio calls do not execute or bill an Apify Actor. Discovering hosted tools is not proof of an Actor run.

Optional self-hosted HTTP

python -m pip install -r requirements.txt
# Set REPUTATION_API_KEY securely to a value of at least 32 characters.
uvicorn api:app --host 127.0.0.1 --port 8080 --workers 1 --limit-concurrency 16 --timeout-keep-alive 5

GET /health is public. POST /score and /cluster require X-API-Key and accept only an edges object. Missing/trivial server keys prevent startup. Invalid auth/JSON/input/body size return 401/400/422/413 respectively. Use TLS, timeouts, and rate limits at a reverse proxy before public exposure. Bind Docker to loopback behind that proxy, for example -p 127.0.0.1:8080:8080. The Docker image runs as an unprivileged user with one worker and 16 concurrent connections.

The app does not store submitted edges or log request bodies; infrastructure operators can still observe requests. No self-hosted billing, customer account system, or API-key issuance is implemented. Deployment status is external to this package. Never submit credentials in edge data.

Offline verification for maintainers

python -m pip install -r requirements.txt httpx jsonschema==4.26.0
python -m unittest discover -q
python scripts/demo_reputation.py
python scripts/verify_all.py

The demo covers fictional labeled launches, independent deployers, and shared-exchange separation. Regression tests cover input limits, duplicate mints, exchange separation, stdio recovery, negotiated legacy/structured results, nullable output/error schemas, Unicode identifier boundaries, authentication/body limits, dataset handoff, and dataset-only Actor delivery. jsonschema is a test-only dependency; local scoring and stdio still need only the standard library. These checks establish software behavior, not predictive validity or paid demand.

Scorer 2.0.0 ID migration

IDs use CL2- plus full SHA-256 of the canonical JSON array of sorted unique role-prefixed deployer/funder identifiers (ensure_ascii=True, compact separators). This replaces ambiguous serialization and 32-bit CL- IDs. Recompute IDs from original membership; old IDs cannot be converted reliably. Score results include scorerVersion; both operations include clusterIdVersion. Numeric weights remain unchanged from the prior scorer. Batch-wide CEX classification applies to clustering, evidence, and components, so conflicting exchange flags can change scores.

Available Tools

2 tools
cluster_launchesA
Read-onlyIdempotent

Group supplied launches by transitive non-exchange funding associations. Use when you need membership and launch counts only; choose deployer_reputation for heuristic scores and label evidence. Requires 1-1000 distinct-mint edges with caller-resolved deployer, pre-launch funder and mint; token-only rows are insufficient. A funder_is_cex flag anywhere prevents that funder joining distinct deployers, while same-deployer launches remain grouped. outcome, lamports and block_time are validated but do not affect grouping. Stateless local computation, no network/RPC, label verification, credentials, storage writes or external side effects. Returns cluster IDs, sorted member identifiers, launch counts, group count and ID version; no scores or safety/ownership claims. Keep connected groups in one batch; separate calls are never joined. Full stdio request lines are limited to 512000 bytes. Invalid input rejects the whole batch with isError=true; correct it and retry.

ParametersJSON Schema
NameRequiredDescriptionDefault
edgesYes1-1000 launches with distinct mints; required per edge: deployer, funder, mint. Resolve multiple funding observations upstream into one edge per launch. Keep connected groups together: arbitrary batch splits change results. Invalid rows reject the whole batch.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Even with annotations declaring readOnlyHint, idempotentHint, and destructiveHint, the description adds substantial behavior: stateless local computation, no network/RPC or credentials, no side effects, invalid input rejecting the whole batch, and the 512000-byte request limit. It also explains that certain fields are validated but do not affect grouping, and that separate calls are never joined.

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 dense but every sentence earns its place, covering purpose, alternative, constraints, behavior, output, batch limits, and error handling. The most decision-relevant information (what it does and when to use it) is front-loaded before constraints and implementation details.

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?

Given the tool's complexity, the rich input schema, the output schema, and the annotations, this description is fully complete. It covers input requirements, grouping semantics, batch-split pitfalls, output contents, limitations (no scores/claims), request-size limits, and failure behavior. Nothing needed 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 coverage is 100%, so the baseline is 3, but the description adds semantic meaning beyond the schema: "transitive non-exchange funding associations," the batch-wide effect of any funder_is_cex flag, and that same-deployer launches remain grouped. This clarifies what the edges parameter actually represents rather than just repeating field formats.

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 states a specific verb and resource: "Group supplied launches by transitive non-exchange funding associations." It clearly distinguishes this from the sibling tool by saying "choose deployer_reputation for heuristic scores and label evidence," so an agent can tell them apart immediately.

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 says when to use this tool: "Use when you need membership and launch counts only." It also names the alternative and the deciding condition, and gives concrete constraints like requiring caller-resolved deployer, pre-launch funder, and mint while noting token-only rows are insufficient.

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

deployer_reputationA
Read-onlyIdempotent

Score funding-association groups in supplied Solana launch records with explainable 0-1 heuristic components and label-coverage evidence. Use after your pipeline resolves deployer, pre-launch funder and mint; choose cluster_launches for membership only. Not for wallet/token lookup, prediction, ownership attribution or safety decisions; scores are not probabilities and low does not mean safe. Supply 1-1000 distinct-mint edges. Keep connected groups together: splitting batches changes results. A funder_is_cex flag anywhere prevents that funder joining distinct deployers; it does not separate the same deployer's launches. lamports and block_time are validated but do not affect scores; cadence measures launch count, not time. Stateless local computation: no network/RPC, label verification, storage writes, credentials or external side effects. Each full stdio request line is limited to 512000 bytes. Returns score-sorted clusters, membership, components, evidence, counts and versions. Check labelCoverage and notes: rug-rate evidence is null without labels, not zero. Invalid input rejects the whole batch with isError=true; correct it and retry.

ParametersJSON Schema
NameRequiredDescriptionDefault
edgesYes1-1000 launches with distinct mints; required per edge: deployer, funder, mint. Resolve multiple funding observations upstream into one edge per launch. Keep connected groups together: arbitrary batch splits change results. Invalid rows reject the whole batch.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

The annotations already indicate readOnly, idempotent, and non-destructive behavior, and the description goes well beyond them by disclosing stateless local computation, absence of network/RPC or storage writes, and the fact that invalid input rejects the whole batch. It also warns that scores are not probabilities and that low scores do not mean safe, which is crucial behavioral context for an AI agent. No contradiction with annotations exists.

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 longer than typical but every sentence earns its place: purpose, exclusions, input constraints, grouping semantics, statelessness, output contents, and error behavior are all covered. It is packed but not rambling; a bulleted structure would improve scannability, but the front-loaded purpose and tight prose keep it well-organized.

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?

For a complex scoring tool with an output schema, the description covers all critical invocation context: input shape and limits, grouping sensitivity, validation semantics, stateless behavior, batch size limit, return contents, and retry behavior on invalid input. The presence of an output schema means return-value details need not be repeated, and the description still summarizes what the output contains.

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?

The input schema already has 100% coverage, so the baseline is 3, but the description adds meaningful operational nuance: edge count limits, the requirement to keep connected groups together, the cross-batch effect of funder_is_cex, and the fact that lamports/block_time are validated but do not affect scoring. This goes beyond schema documentation, though the schema still carries most of the parameter burden.

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 verb and resource ('Score funding-association groups in supplied Solana launch records') and clearly names the deliverable ('explainable 0-1 heuristic components and label-coverage evidence'). It also distinguishes itself from sibling cluster_launches by noting that membership-only grouping belongs to that sibling. This gives an agent a precise mental model of the tool's function.

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?

The description is explicit about when to use the tool ('Use after your pipeline resolves deployer, pre-launch funder and mint') and when not to use it ('Not for wallet/token lookup, prediction, ownership attribution or safety decisions'). It even names the sibling alternative for membership-only needs. This is strong routing guidance with no ambiguity.

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. 2 tool updatesv1.1.0
    • Changedcluster_launches25 fields changed
      • addedInput schema / description
        Added value: +"Caller-enriched snapshot; no datasetId, operation or payload. Each complete stdio request line, including JSON-RPC envelope and newline, must fit 512000 bytes. Examples use fictional identifiers."
      • addedInput schema / examples
        Added value: +[
        +  {
        +    "edges": [
        +      {
        +        "deployer": "DemoDeployerA",
        +        "funder": "DemoSharedFunder",
        +        "mint": "DemoMintA"
        +      }
        +    ]
        +  }
        +]
      • changedInput schema / properties / edges / description
        Previous value: -"1-1000 caller-enriched launches with distinct mints. Required per edge: deployer, funder, mint. No RPC, wallet lookup or label verification; token-only rows are insufficient. Calls are stateless."New value: +"1-1000 launches with distinct mints; required per edge: deployer, funder, mint. Resolve multiple funding observations upstream into one edge per launch. Keep connected groups together: arbitrary batch splits change results. Invalid rows reject the whole batch."
      • addedInput schema / properties / edges / items / properties / block_time / default
        Added value: +null
      • changedInput schema / properties / edges / items / properties / block_time / description
        Previous value: -"Nonnegative Unix timestamp in seconds or null, not ISO text or milliseconds. Currently does not affect scoring."New value: +"Integer Unix timestamp in seconds or null, not ISO text, milliseconds or boolean. Validated but not used in grouping or scoring."
      • addedInput schema / properties / edges / items / properties / block_time / examples
        Added value: +[
        +  1700000000,
        +  null
        +]
      • changedInput schema / properties / edges / items / properties / deployer / description
        Previous value: -"Required caller-resolved launch deployer. Opaque identifier, not a verified address or token holder."New value: +"Caller-resolved launch deployer. Opaque, case-sensitive identifier; not address-validated. No whitespace, control characters or Unicode surrogates."
      • addedInput schema / properties / edges / items / properties / deployer / examples
        Added value: +[
        +  "DemoDeployerA"
        +]
      • changedInput schema / properties / edges / items / properties / deployer / pattern
        Previous value: -"^[^\\s\\u0000-\\u001f\\u007f-\\u009f\\ud800-\\udfff]+$"New value: +"^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])"
      • changedInput schema / properties / edges / items / properties / funder / description
        Previous value: -"Required caller-resolved wallet that seeded this deployer before the launch. Never substitute a pool or unknown placeholder."New value: +"Caller-resolved wallet that seeded this deployer before launch. Same identifier rules as deployer. Never substitute a pool or shared unknown placeholder."
      • addedInput schema / properties / edges / items / properties / funder / examples
        Added value: +[
        +  "DemoSharedFunder"
        +]
      • changedInput schema / properties / edges / items / properties / funder / pattern
        Previous value: -"^[^\\s\\u0000-\\u001f\\u007f-\\u009f\\ud800-\\udfff]+$"New value: +"^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])"
      • addedInput schema / properties / edges / items / properties / funder_is_cex / default
        Added value: +false
      • changedInput schema / properties / edges / items / properties / funder_is_cex / description
        Previous value: -"Strict boolean, default false. Mark known exchange/infrastructure funders; any true flag prevents that funder joining distinct deployers across this batch."New value: +"Strict boolean. Any true flag excludes this funder from joining distinct deployers across the entire batch; same-deployer launches still group. false is not verified non-exchange status."
      • addedInput schema / properties / edges / items / properties / funder_is_cex / examples
        Added value: +[
        +  false,
        +  true
        +]
      • addedInput schema / properties / edges / items / properties / lamports / default
        Added value: +0
      • changedInput schema / properties / edges / items / properties / lamports / description
        Previous value: -"Nonnegative integer funding amount in lamports, not SOL or a string; defaults to 0. Currently does not affect scoring."New value: +"Integer funding amount in lamports, not SOL, a numeric string or boolean. Validated but not used in grouping or scoring."
      • addedInput schema / properties / edges / items / properties / lamports / examples
        Added value: +[
        +  1000000000
        +]
      • changedInput schema / properties / edges / items / properties / mint / description
        Previous value: -"Required launched token identifier, unique within this batch. One edge per mint; not a trading-pair address."New value: +"Launched token identifier, not its trading-pair address. Same identifier rules as deployer. Must be unique across the batch, even when other fields differ."
      • addedInput schema / properties / edges / items / properties / mint / examples
        Added value: +[
        +  "DemoMintA"
        +]
      • changedInput schema / properties / edges / items / properties / mint / pattern
        Previous value: -"^[^\\s\\u0000-\\u001f\\u007f-\\u009f\\ud800-\\udfff]+$"New value: +"^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])"
      • addedInput schema / properties / edges / items / properties / outcome / default
        Added value: +"unknown"
      • changedInput schema / properties / edges / items / properties / outcome / description
        Previous value: -"Caller-supplied label; defaults to unknown. rugged maps to rug. Unknown is missing evidence, not safe; labels are not verified."New value: +"Caller-supplied label; rugged maps to rug. unknown is excluded from labeled-launch counts and rug-rate denominators. Labels are not verified."
      • addedInput schema / properties / edges / items / properties / outcome / examples
        Added value: +[
        +  "unknown",
        +  "rugged"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "description": "MCP structuredContent for supported 2025 revisions, also serialized in content[0].text. Protocol-envelope and unknown-tool failures are separate JSON-RPC errors, not analysis objects.",
        +  "oneOf": [
        +    {
        +      "additionalProperties": false,
        +      "description": "Successful analysis; MCP isError is false.",
        +      "properties": {
        +        "clusterIdVersion": {
        +          "const": "CL2-SHA256",
        +          "type": "string"
        +        },
        +        "clusters": {
        +          "description": "Groups ordered by descending deployers-per-funder, then launch count, then cluster ID. No score or label evidence.",
        +          "items": {
        +            "additionalProperties": false,
        +            "description": "Funding association within this batch, not common ownership.",
        +            "properties": {
        +              "cluster_id": {
        +                "description": "SHA-256 of sorted role-prefixed deployer/funder membership, not operator identity. Mint/label-only changes keep the ID; membership changes can change it.",
        +                "pattern": "^CL2-[0-9a-f]{64}(?![\\s\\S])",
        +                "type": "string"
        +              },
        +              "deployers": {
        +                "description": "Sorted unique supplied deployers in this group.",
        +                "items": {
        +                  "maxLength": 128,
        +                  "minLength": 1,
        +                  "pattern": "^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])",
        +                  "type": "string"
        +                },
        +                "maxItems": 1000,
        +                "minItems": 1,
        +                "type": "array",
        +                "uniqueItems": true
        +              },
        +              "funders": {
        +                "description": "Sorted unique supplied funders in this group.",
        +                "items": {
        +                  "maxLength": 128,
        +                  "minLength": 1,
        +                  "pattern": "^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])",
        +                  "type": "string"
        +                },
        +                "maxItems": 1000,
        +                "minItems": 1,
        +                "type": "array",
        +                "uniqueItems": true
        +              },
        +              "mints": {
        +                "description": "Sorted unique supplied mints in this group.",
        +                "items": {
        +                  "maxLength": 128,
        +                  "minLength": 1,
        +                  "pattern": "^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])",
        +                  "type": "string"
        +                },
        +                "maxItems": 1000,
        +                "minItems": 1,
        +                "type": "array",
        +                "uniqueItems": true
        +              },
        +              "n_launches": {
        +                "description": "Distinct supplied mints in this group.",
        +                "maximum": 1000,
        +                "minimum": 1,
        +                "type": "integer"
        +              }
        +            },
        +            "required": [
        +              "cluster_id",
        +              "n_launches",
        +              "deployers",
        +              "funders",
        +              "mints"
        +            ],
        +            "type": "object"
        +          },
        +          "maxItems": 1000,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "n_clusters": {
        +          "description": "Number of returned groups.",
        +          "maximum": 1000,
        +          "minimum": 1,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "clusters",
        +        "n_clusters",
        +        "clusterIdVersion"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "description": "Rejected input; MCP isError is true. No partial analysis returned.",
        +      "properties": {
        +        "error": {
        +          "description": "Input rejection reason; correct the batch and retry.",
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "error"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
    • Changeddeployer_reputation25 fields changed
      • addedInput schema / description
        Added value: +"Caller-enriched snapshot; no datasetId, operation or payload. Each complete stdio request line, including JSON-RPC envelope and newline, must fit 512000 bytes. Examples use fictional identifiers."
      • addedInput schema / examples
        Added value: +[
        +  {
        +    "edges": [
        +      {
        +        "deployer": "DemoDeployerA",
        +        "funder": "DemoSharedFunder",
        +        "mint": "DemoMintA"
        +      }
        +    ]
        +  }
        +]
      • changedInput schema / properties / edges / description
        Previous value: -"1-1000 caller-enriched launches with distinct mints. Required per edge: deployer, funder, mint. No RPC, wallet lookup or label verification; token-only rows are insufficient. Calls are stateless."New value: +"1-1000 launches with distinct mints; required per edge: deployer, funder, mint. Resolve multiple funding observations upstream into one edge per launch. Keep connected groups together: arbitrary batch splits change results. Invalid rows reject the whole batch."
      • addedInput schema / properties / edges / items / properties / block_time / default
        Added value: +null
      • changedInput schema / properties / edges / items / properties / block_time / description
        Previous value: -"Nonnegative Unix timestamp in seconds or null, not ISO text or milliseconds. Currently does not affect scoring."New value: +"Integer Unix timestamp in seconds or null, not ISO text, milliseconds or boolean. Validated but not used in grouping or scoring."
      • addedInput schema / properties / edges / items / properties / block_time / examples
        Added value: +[
        +  1700000000,
        +  null
        +]
      • changedInput schema / properties / edges / items / properties / deployer / description
        Previous value: -"Required caller-resolved launch deployer. Opaque identifier, not a verified address or token holder."New value: +"Caller-resolved launch deployer. Opaque, case-sensitive identifier; not address-validated. No whitespace, control characters or Unicode surrogates."
      • addedInput schema / properties / edges / items / properties / deployer / examples
        Added value: +[
        +  "DemoDeployerA"
        +]
      • changedInput schema / properties / edges / items / properties / deployer / pattern
        Previous value: -"^[^\\s\\u0000-\\u001f\\u007f-\\u009f\\ud800-\\udfff]+$"New value: +"^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])"
      • changedInput schema / properties / edges / items / properties / funder / description
        Previous value: -"Required caller-resolved wallet that seeded this deployer before the launch. Never substitute a pool or unknown placeholder."New value: +"Caller-resolved wallet that seeded this deployer before launch. Same identifier rules as deployer. Never substitute a pool or shared unknown placeholder."
      • addedInput schema / properties / edges / items / properties / funder / examples
        Added value: +[
        +  "DemoSharedFunder"
        +]
      • changedInput schema / properties / edges / items / properties / funder / pattern
        Previous value: -"^[^\\s\\u0000-\\u001f\\u007f-\\u009f\\ud800-\\udfff]+$"New value: +"^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])"
      • addedInput schema / properties / edges / items / properties / funder_is_cex / default
        Added value: +false
      • changedInput schema / properties / edges / items / properties / funder_is_cex / description
        Previous value: -"Strict boolean, default false. Mark known exchange/infrastructure funders; any true flag prevents that funder joining distinct deployers across this batch."New value: +"Strict boolean. Any true flag excludes this funder from joining distinct deployers across the entire batch; same-deployer launches still group. false is not verified non-exchange status."
      • addedInput schema / properties / edges / items / properties / funder_is_cex / examples
        Added value: +[
        +  false,
        +  true
        +]
      • addedInput schema / properties / edges / items / properties / lamports / default
        Added value: +0
      • changedInput schema / properties / edges / items / properties / lamports / description
        Previous value: -"Nonnegative integer funding amount in lamports, not SOL or a string; defaults to 0. Currently does not affect scoring."New value: +"Integer funding amount in lamports, not SOL, a numeric string or boolean. Validated but not used in grouping or scoring."
      • addedInput schema / properties / edges / items / properties / lamports / examples
        Added value: +[
        +  1000000000
        +]
      • changedInput schema / properties / edges / items / properties / mint / description
        Previous value: -"Required launched token identifier, unique within this batch. One edge per mint; not a trading-pair address."New value: +"Launched token identifier, not its trading-pair address. Same identifier rules as deployer. Must be unique across the batch, even when other fields differ."
      • addedInput schema / properties / edges / items / properties / mint / examples
        Added value: +[
        +  "DemoMintA"
        +]
      • changedInput schema / properties / edges / items / properties / mint / pattern
        Previous value: -"^[^\\s\\u0000-\\u001f\\u007f-\\u009f\\ud800-\\udfff]+$"New value: +"^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])"
      • addedInput schema / properties / edges / items / properties / outcome / default
        Added value: +"unknown"
      • changedInput schema / properties / edges / items / properties / outcome / description
        Previous value: -"Caller-supplied label; defaults to unknown. rugged maps to rug. Unknown is missing evidence, not safe; labels are not verified."New value: +"Caller-supplied label; rugged maps to rug. unknown is excluded from labeled-launch counts and rug-rate denominators. Labels are not verified."
      • addedInput schema / properties / edges / items / properties / outcome / examples
        Added value: +[
        +  "unknown",
        +  "rugged"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "description": "MCP structuredContent for supported 2025 revisions, also serialized in content[0].text. Protocol-envelope and unknown-tool failures are separate JSON-RPC errors, not analysis objects.",
        +  "oneOf": [
        +    {
        +      "additionalProperties": false,
        +      "description": "Successful analysis; MCP isError is false.",
        +      "properties": {
        +        "caveat": {
        +          "description": "Uncalibrated, caller-supplied-evidence and attribution limits.",
        +          "type": "string"
        +        },
        +        "clusterIdVersion": {
        +          "const": "CL2-SHA256",
        +          "type": "string"
        +        },
        +        "clusters": {
        +          "description": "Groups ordered by descending score; inspect components and label coverage before interpreting the band.",
        +          "items": {
        +            "additionalProperties": false,
        +            "description": "Scored funding-association group. Structural signals can be nonzero without labels.",
        +            "properties": {
        +              "band": {
        +                "description": "high requires score >=0.50 and at least one supplied rug label; otherwise >=0.28 is elevated, else low. Policy thresholds, not calibrated risk.",
        +                "enum": [
        +                  "low",
        +                  "elevated",
        +                  "high"
        +                ],
        +                "type": "string"
        +              },
        +              "cluster_id": {
        +                "description": "SHA-256 of sorted role-prefixed deployer/funder membership, not operator identity. Mint/label-only changes keep the ID; membership changes can change it.",
        +                "pattern": "^CL2-[0-9a-f]{64}(?![\\s\\S])",
        +                "type": "string"
        +              },
        +              "components": {
        +                "additionalProperties": false,
        +                "description": "Unweighted component values, rounded to four decimals.",
        +                "properties": {
        +                  "cadence": {
        +                    "description": "Saturating launch-count excess above one, not elapsed time; weight 0.16.",
        +                    "maximum": 1,
        +                    "minimum": 0,
        +                    "type": "number"
        +                  },
        +                  "cex": {
        +                    "description": "One if any funder is batch-wide exchange-flagged, otherwise zero; weight 0.08. Not evidence of misconduct.",
        +                    "maximum": 1,
        +                    "minimum": 0,
        +                    "type": "number"
        +                  },
        +                  "fanout": {
        +                    "description": "Saturating launch-count proxy for breadth; weight 0.12.",
        +                    "maximum": 1,
        +                    "minimum": 0,
        +                    "type": "number"
        +                  },
        +                  "rugs": {
        +                    "description": "Wilson lower bound from supplied labels, or zero if none are labeled; weight 0.30. Zero is not evidence of safety.",
        +                    "maximum": 1,
        +                    "minimum": 0,
        +                    "type": "number"
        +                  },
        +                  "serial": {
        +                    "description": "Saturating excess of deployers per funder above one; weight 0.34.",
        +                    "maximum": 1,
        +                    "minimum": 0,
        +                    "type": "number"
        +                  }
        +                },
        +                "required": [
        +                  "serial",
        +                  "cadence",
        +                  "fanout",
        +                  "cex",
        +                  "rugs"
        +                ],
        +                "type": "object"
        +              },
        +              "deployers": {
        +                "description": "Sorted unique supplied deployers in this group.",
        +                "items": {
        +                  "maxLength": 128,
        +                  "minLength": 1,
        +                  "pattern": "^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])",
        +                  "type": "string"
        +                },
        +                "maxItems": 1000,
        +                "minItems": 1,
        +                "type": "array",
        +                "uniqueItems": true
        +              },
        +              "evidence": {
        +                "additionalProperties": false,
        +                "description": "Evidence only from this submitted snapshot; nothing fetched or verified.",
        +                "properties": {
        +                  "any_cex": {
        +                    "description": "Any funder is exchange-flagged anywhere in this batch; caller supplied, not verified.",
        +                    "type": "boolean"
        +                  },
        +                  "deployers_per_funder": {
        +                    "description": "n_deployers / n_funders, rounded to three decimals.",
        +                    "maximum": 1000,
        +                    "minimum": 0.001,
        +                    "type": "number"
        +                  },
        +                  "labelCoverage": {
        +                    "description": "labeled_launches / n_launches, rounded to four decimals.",
        +                    "maximum": 1,
        +                    "minimum": 0,
        +                    "type": "number"
        +                  },
        +                  "labeled_launches": {
        +                    "description": "Launches labeled rug, rugged, alive or graduated; excludes unknown.",
        +                    "maximum": 1000,
        +                    "minimum": 0,
        +                    "type": "integer"
        +                  },
        +                  "n_deployers": {
        +                    "description": "Distinct deployers in this group.",
        +                    "maximum": 1000,
        +                    "minimum": 1,
        +                    "type": "integer"
        +                  },
        +                  "n_funders": {
        +                    "description": "Distinct funders, including flagged exchange funders.",
        +                    "maximum": 1000,
        +                    "minimum": 1,
        +                    "type": "integer"
        +                  },
        +                  "n_launches": {
        +                    "description": "Distinct supplied launches in this group.",
        +                    "maximum": 1000,
        +                    "minimum": 1,
        +                    "type": "integer"
        +                  },
        +                  "notes": {
        +                    "description": "Caveats about supplied labels, missing or incomplete outcomes, and low not meaning safe.",
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  "observed_rug_rate": {
        +                    "description": "rug_launches / labeled_launches, rounded to four decimals; null without labels. Not a population estimate.",
        +                    "maximum": 1,
        +                    "minimum": 0,
        +                    "type": [
        +                      "number",
        +                      "null"
        +                    ]
        +                  },
        +                  "rug_evidence": {
        +                    "description": "labeled when any labels are supplied; otherwise an UNLABELED structural-only warning.",
        +                    "type": "string"
        +                  },
        +                  "rug_launches": {
        +                    "description": "Launches labeled rug or rugged.",
        +                    "maximum": 1000,
        +                    "minimum": 0,
        +                    "type": "integer"
        +                  },
        +                  "rug_rate_wilson_lb": {
        +                    "description": "Wilson lower bound using z=1.96 on supplied labeled launches, rounded to four decimals; null without labels. Does not validate label quality or sampling.",
        +                    "maximum": 1,
        +                    "minimum": 0,
        +                    "type": [
        +                      "number",
        +                      "null"
        +                    ]
        +                  }
        +                },
        +                "required": [
        +                  "n_deployers",
        +                  "n_funders",
        +                  "n_launches",
        +                  "deployers_per_funder",
        +                  "any_cex",
        +                  "labeled_launches",
        +                  "rug_launches",
        +                  "labelCoverage",
        +                  "notes",
        +                  "observed_rug_rate",
        +                  "rug_rate_wilson_lb",
        +                  "rug_evidence"
        +                ],
        +                "type": "object"
        +              },
        +              "funders": {
        +                "description": "Sorted unique supplied funders in this group.",
        +                "items": {
        +                  "maxLength": 128,
        +                  "minLength": 1,
        +                  "pattern": "^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])",
        +                  "type": "string"
        +                },
        +                "maxItems": 1000,
        +                "minItems": 1,
        +                "type": "array",
        +                "uniqueItems": true
        +              },
        +              "mints": {
        +                "description": "Sorted unique supplied mints in this group.",
        +                "items": {
        +                  "maxLength": 128,
        +                  "minLength": 1,
        +                  "pattern": "^[^\\u0000-\\u0020\\u007f-\\u00a0\\u1680\\u2000-\\u200a\\u2028-\\u2029\\u202f\\u205f\\u3000\\ud800-\\udfff]+(?![\\s\\S])",
        +                  "type": "string"
        +                },
        +                "maxItems": 1000,
        +                "minItems": 1,
        +                "type": "array",
        +                "uniqueItems": true
        +              },
        +              "n_launches": {
        +                "description": "Distinct supplied mints in this group.",
        +                "maximum": 1000,
        +                "minimum": 1,
        +                "type": "integer"
        +              },
        +              "score": {
        +                "description": "Weighted heuristic sum rounded to four decimals, not a probability, prediction or safety verdict.",
        +                "maximum": 1,
        +                "minimum": 0,
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "cluster_id",
        +              "n_launches",
        +              "deployers",
        +              "funders",
        +              "mints",
        +              "score",
        +              "band",
        +              "components",
        +              "evidence"
        +            ],
        +            "type": "object"
        +          },
        +          "maxItems": 1000,
        +          "minItems": 1,
        +          "type": "array"
        +        },
        +        "model": {
        +          "const": "ff.cluster supplied-edge heuristic",
        +          "type": "string"
        +        },
        +        "n_clusters": {
        +          "description": "Number of returned groups.",
        +          "maximum": 1000,
        +          "minimum": 1,
        +          "type": "integer"
        +        },
        +        "n_edges": {
        +          "description": "Number of validated supplied launches.",
        +          "maximum": 1000,
        +          "minimum": 1,
        +          "type": "integer"
        +        },
        +        "scorerVersion": {
        +          "const": "2.0.0",
        +          "description": "Scoring policy version, independent of the MCP server release.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "clusters",
        +        "n_clusters",
        +        "n_edges",
        +        "model",
        +        "scorerVersion",
        +        "clusterIdVersion",
        +        "caveat"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "additionalProperties": false,
        +      "description": "Rejected input; MCP isError is true. No partial analysis returned.",
        +      "properties": {
        +        "error": {
        +          "description": "Input rejection reason; correct the batch and retry.",
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "error"
        +      ],
        +      "type": "object"
        +    }
        +  ],
        +  "type": "object"
        +}
  2. 2 tool updatesv1.0.0
    • First observedcluster_launches
    • First observeddeployer_reputation

TDQS

A4.6/5.0

Scored across 2 tools

Disambiguation4/5

The two tools are closely related but clearly differentiated by purpose: cluster_launches provides membership and counts, while deployer_reputation produces heuristic scores and evidence. The descriptions explicitly tell the agent which tool to use based on whether scores are needed, minimizing misselection risk.

Naming Consistency4/5

Both names are compound nouns with underscore separation, following a similar pattern. 'cluster_launches' could be misread as an imperative verb, but 'deployer_reputation' is clearly a noun, and the overall naming style is consistent and legible.

Tool Count3/5

With only two tools, the server sits on the thin side of the acceptable range. However, both tools serve distinct and necessary steps in the same workflow, so each earns its place, even though the count feels minimal.

Completeness4/5

The server covers the two core operations of the domain: grouping launches into clusters and scoring those clusters with evidence. Minor gaps exist—such as no tool for single-deployer lookup or label verification—but the descriptions explicitly scope those responsibilities to the caller's upstream pipeline.

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
    17 npm
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Agent-native scored launch intelligence for Base blockchain, providing opportunity/risk scores and AVOID/WATCH/HOT decisions per fresh launch via x402 pay-per-call API. Enables trading/research agents to act directly on structured launch data.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Solana memecoin rug check and token risk for trading agents in the trenches: pump.fun launches, calibrated rug probability with a published hit rate, sniper, insider and bundle detection, holder clusters, KOL trades, wallet history and a live sellability check for memecoins. Available as a remote MCP endpoint (OAuth or API key) and as an npm stdio package.
    26
    48 npm
    3
    MIT