deployer-reputation-mcp
This server provides two stateless, explainable heuristic tools for analyzing caller-supplied Solana launch funding edges.
deployer_reputation: Scores batches of 1–1000 launch edges, grouping them by shared non-CEX funders and returning heuristic 0–1 scores, policy bands (low/elevated/high), and component breakdowns (serial, cadence, fanout, cex, rugs).cluster_launches: Groups launches by non-exchange funding associations without scores or bands, returning membership clusters and counts.Input format: Each edge must include
deployer,funder, andmint; optional fields areoutcome,funder_is_cex,lamports, andblock_time.Distinct mints required: Duplicate or conflicting mints reject the whole batch; max 1000 edges per call.
Exchange separation: Any
funder_is_cex: trueprevents that funder from joining distinct deployers.Outcome labels: Accepts
unknown,rug,rugged,alive,graduated; labels are caller-supplied and not verified.No external lookups: Does not fetch RPC data, verify wallets, discover funding, or validate labels; it only processes the supplied edges locally.
Stateless: Each call is independent; no historical memory or cross-call aggregation.
Provides tools to score and group caller-supplied Solana deployer launch records based on heuristic reputation signals, without making on-chain RPC requests or verifying wallet ownership.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@deployer-reputation-mcpScore these Solana launch records and group them by deployer reputation."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Open the Actor and switch its input to JSON.
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"}
]
}Check current Store pricing before starting. This example produces one $0.005 analysis result, not three charges.
Set the run's maximum total charge to $0.01 (
maxTotalChargeUsdfor API callers), then start it.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 |
| Required nonempty string | Identify the launch deployer from evidence; a token holder or swap wallet is not a substitute. |
| Required nonempty string | Resolve funding of that deployer before the launch. Do not substitute a pool address, mint, or common |
| Required nonempty string; unique within the batch | Supply the launched token identifier, not its trading-pair address. |
| Optional: | Supply only supported labels you can substantiate. |
| Optional strict boolean; default | Mark known exchange/infrastructure funders. The default is not verification that a wallet is non-exchange. |
| Optional integer, 0–18446744073709551615; default 0 | Funding amount in lamports, not SOL or a numeric string. Currently does not affect the score. |
| Optional Unix timestamp in seconds, 0–253402300799, or | 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 |
|
|
| Membership and launch counts within this batch only. |
| Uncalibrated 0–1 heuristic and policy band: |
|
|
| Caller-supplied label counts and labeled/total launch fraction. Check these before interpreting the band. |
| Statistics over supplied labeled launches only; both are |
| 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:
Collect new launch/funding evidence in your own pipeline. Resolve exchange flags and outcome labels there.
Rebuild your chosen analysis snapshot, including relevant older launches. Replace old rows when labels change; never append duplicate mints.
Project only the documented fields. Record the snapshot time, source coverage, and label policy outside the Actor input.
Keep related deployers and non-exchange funding groups together when dividing work into batches of at most 1,000 edges.
Run one batch per input or dataset. Save the result, input snapshot, scorer version, and Apify run/dataset IDs together.
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 |
| No | |
| 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.pyIt 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.pyPOSIX shell:
python deployer_reputation_mcp.py < examples/mcp_quickstart.jsonlExpected replies:
Request ID | Result |
1 | Initialization reports server |
2 |
|
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 |
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 5GET /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.pyThe 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 toolscluster_launchesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| edges | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_reputationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| edges | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
2 tool updates
v1.1.0- Changed
cluster_launches25 fields changed- added
Input schema / descriptionAdded 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." - added
Input schema / examplesAdded value: +[ + { + "edges": [ + { + "deployer": "DemoDeployerA", + "funder": "DemoSharedFunder", + "mint": "DemoMintA" + } + ] + } +] - changed
Input schema / properties / edges / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / block_time / defaultAdded value: +null - changed
Input schema / properties / edges / items / properties / block_time / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / block_time / examplesAdded value: +[ + 1700000000, + null +] - changed
Input schema / properties / edges / items / properties / deployer / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / deployer / examplesAdded value: +[ + "DemoDeployerA" +] - changed
Input schema / properties / edges / items / properties / deployer / patternPrevious 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])" - changed
Input schema / properties / edges / items / properties / funder / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / funder / examplesAdded value: +[ + "DemoSharedFunder" +] - changed
Input schema / properties / edges / items / properties / funder / patternPrevious 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])" - added
Input schema / properties / edges / items / properties / funder_is_cex / defaultAdded value: +false - changed
Input schema / properties / edges / items / properties / funder_is_cex / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / funder_is_cex / examplesAdded value: +[ + false, + true +] - added
Input schema / properties / edges / items / properties / lamports / defaultAdded value: +0 - changed
Input schema / properties / edges / items / properties / lamports / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / lamports / examplesAdded value: +[ + 1000000000 +] - changed
Input schema / properties / edges / items / properties / mint / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / mint / examplesAdded value: +[ + "DemoMintA" +] - changed
Input schema / properties / edges / items / properties / mint / patternPrevious 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])" - added
Input schema / properties / edges / items / properties / outcome / defaultAdded value: +"unknown" - changed
Input schema / properties / edges / items / properties / outcome / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / outcome / examplesAdded value: +[ + "unknown", + "rugged" +] - changed
Output 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" +}
- Changed
deployer_reputation25 fields changed- added
Input schema / descriptionAdded 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." - added
Input schema / examplesAdded value: +[ + { + "edges": [ + { + "deployer": "DemoDeployerA", + "funder": "DemoSharedFunder", + "mint": "DemoMintA" + } + ] + } +] - changed
Input schema / properties / edges / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / block_time / defaultAdded value: +null - changed
Input schema / properties / edges / items / properties / block_time / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / block_time / examplesAdded value: +[ + 1700000000, + null +] - changed
Input schema / properties / edges / items / properties / deployer / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / deployer / examplesAdded value: +[ + "DemoDeployerA" +] - changed
Input schema / properties / edges / items / properties / deployer / patternPrevious 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])" - changed
Input schema / properties / edges / items / properties / funder / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / funder / examplesAdded value: +[ + "DemoSharedFunder" +] - changed
Input schema / properties / edges / items / properties / funder / patternPrevious 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])" - added
Input schema / properties / edges / items / properties / funder_is_cex / defaultAdded value: +false - changed
Input schema / properties / edges / items / properties / funder_is_cex / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / funder_is_cex / examplesAdded value: +[ + false, + true +] - added
Input schema / properties / edges / items / properties / lamports / defaultAdded value: +0 - changed
Input schema / properties / edges / items / properties / lamports / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / lamports / examplesAdded value: +[ + 1000000000 +] - changed
Input schema / properties / edges / items / properties / mint / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / mint / examplesAdded value: +[ + "DemoMintA" +] - changed
Input schema / properties / edges / items / properties / mint / patternPrevious 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])" - added
Input schema / properties / edges / items / properties / outcome / defaultAdded value: +"unknown" - changed
Input schema / properties / edges / items / properties / outcome / descriptionPrevious 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." - added
Input schema / properties / edges / items / properties / outcome / examplesAdded value: +[ + "unknown", + "rugged" +] - changed
Output 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 tool updates
v1.0.0- First observed
cluster_launches - First observed
deployer_reputation
TDQS
Scored across 2 tools
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.
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.
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.
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
Related MCP Connectors
Solana wallet & token reputation lookup. Risk verdict, score, DefiLlama TVL, Rugcheck.
Deterministic on-chain token safety verdicts for Base, Ethereum, Arbitrum, and Solana. No LLM — pure on-chain data including Clanker CREATE2 resolution, Pump.fun bonding curve detection, Raydium LP checks, and a pro tier with Farcaster social signals and holder growth velocity. Also includes /verdict/pump — a fast Pump.fun specific verdict optimised for HFT at 474ms p50, covering bonding curve SOL reserve, graduation status, and deployer age. Solana only, $0.02 USDC."
Solana memecoin rug + creator-reputation checks for agents. PASS/CAUTION/FAIL + 0-100 score.
Solana address risk grades and token scans for AI agents. Pay-per-call via x402 (USDC on Base).
Related MCP Servers
AlicenseAqualityBmaintenanceProvides post-deploy Solana threat intelligence, enabling AI agents to check operators, tokens, and network stats for detecting rug pulls and malicious activity.517 npmMIT- FlicenseNot gradedqualityDmaintenanceAgent-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.-
- AlicenseAqualityBmaintenanceOn-chain Solana cabal & rug detection as an MCP server. Scans any Solana token mint before your agent buys and returns an Exit-Liquidity Risk verdict.1184 npmMIT
- AlicenseAqualityAmaintenanceSolana 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.2648 npm3MIT